这是我的代码:
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
加倍^
使我的脚本失败,我该如何解决?
答案 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。
有几种方法可以解决这个问题:
简单地撤消子程序中插入符号加倍:
@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
答案 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