windows - 将字符串作为参数发送到批处理脚本中时,^ 会加倍

标签 windows batch-file cmd escaping

这是我的代码:

set var1="`netsh int ipv4 show interface ^| findstr /I Network`"

call:GetEles %var1%
goto:eof

:GetEles
for /F "tokens=1 usebackq" %%F IN (%~1) do echo %%F
goto:eof

当我在运行时检查命令时,^在函数内部翻倍 :GetEles :
for /F "token=1 usebackq" %%F IN (`netsh int ipv4 show interface ^^| findstr /I Network`) do echo %%F

翻倍^使我的脚本失败,我该如何解决?

最佳答案

正如其他人已经描述的那样,这是 call command 的一个令人讨厌的“功能”。 .

有几个选项可以解决这个问题:

  • 只需撤消子程序中的插入符号加倍:

    @echo off
    set "VAR=caret^symbol"
    call :SUB "%VAR%"
    exit /B
    
    :SUB
        set "ARG=%~1"
        echo Argument: "%ARG:^^=^%"
        exit /B
    
  • call引入第二个解析阶段,所以让第二个阶段扩展变量:

    @echo off
    set "VAR=caret^symbol"
    call :SUB "%%VAR%%"
    exit /B
    
    :SUB
        echo Argument: "%~1"
        exit /B
    
  • 通过引用传递值(所以是变量名)而不是通过值:

    @echo off
    set "VAR=caret^symbol"
    call :SUB VAR
    exit /B
    
    :SUB
        setlocal EnableDelayedExpansion
        echo Argument: "!%~1!"
        endlocal
        exit /B
    
  • 不要将变量值传递给子例程,而是在那里读取(全局)变量:

    @echo off
    set "VAR=caret^symbol"
    call :SUB
    exit /B
    
    :SUB
        echo Argument: "%VAR%"
        exit /B
    
  • 关于windows - 将字符串作为参数发送到批处理脚本中时,^ 会加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769803/

    相关文章:

    windows - findstr命令变量在for循环批处理脚本中的路径中扩展(Windows,批处理脚本)

    c - 不升起窗口的 PostMessage Ctrl+V

    c++ - wsprintf() 的安全版本?

    visual-studio - 如何打开vs2015的开发者命令提示符?

    c# - 如何从 C# 关闭计算机

    batch-file - 通过批处理文件删除所有不包含 "2020"的行

    batch-file - 字符串批处理文件的 Base64 解码

    batch-file - 批处理脚本可在一分钟内查找和替换文本文件中的字符串,文件最大为 12 MB

    command-line - 我需要在 Visual Basic 脚本中执行命令行

    powershell - 如何在 VSTS 中的托管代理上运行或安装工具