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

时间:2017-01-20 18:04:06

标签: batch-file cmd

这是我的代码:

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

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

3 个答案:

答案 0 :(得分:3)

阅读Buggy behaviour when using CALL

  

使用& | <>的重定向无法按预期工作。

     

如果CALL命令在带引号的字符串中包含插入符号   "test^ing"插入符号将加倍

请尝试以下代码段:

@echo off
SETLOCAL EnableExtensions

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

call:GetEles "%var1%"
goto:eof

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

<强>输出

d:\bat> D:\bat\SO\41769803.bat

variable  "`netsh int ipv4 show interface ^| findstr /I "Network"`"
parameter "`netsh int ipv4 show interface ^^| findstr /I "Network"`"

答案 1 :(得分:3)

正如其他人已经描述的那样,这是一个讨厌的特征&#34; call command

有几种方法可以解决这个问题:

  1. 简单地撤消子程序中插入符号加倍:

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

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

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

    @echo off
    set "VAR=caret^symbol"
    call :SUB
    exit /B
    
    :SUB
        echo Argument: "%VAR%"
        exit /B
    

答案 2 :(得分:2)

尝试这样,call不会将%var1%扩展到会暴露毒药角色的点

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

call:GetEles "%%var1%%"
goto:eof

:GetEles
for /F %%F IN (%~1) do echo %%F
goto:eof

您会注意到tokens=1不需要usebackq