假设这个batch file
call :SomeFunction "a string with an > arrow" goto:eof :SomeFunction echo %~1 goto:eof
这是输出
调用:SomeFunction“带有箭头的string” 用1>箭头回显一个string GOTO:EOF GOTO:EOF
并创build一个名为arrow
的文件,其中包含a string with an
。 注意1>
。
在这种情况下,我怎样才能防止命令处理器解释>
作为redirect符号? (提示:我已经尝试了^>
而不是这样。)
编辑:其他运营商( |
和&
)当然也受到影响。
您可以使用FOR /F
命令,而不是:
echo %~1
用这个:
FOR /F "delims=" %%i IN ("%~1") DO echo %%i
编辑:请注意,现在当你传递用双引号分隔的参数时,你需要处理奇怪的转义行为。 例如, "a^2"
将会被转义为"a^^2"
,如果您尝试使用"a^^2"
或"a\^2"
无关紧要。 你可以做什么(从你自己的意见)是使用一个临时变量,并逃避(然后删除双引号):
set TEMP=%TEMP:>=^>%
如果你不想关心逃跑,你也可以尝试:
set "tmp="many \ ^ > ' characters and quotes""
请注意双引号括住set
参数和字符串中的许多特殊字符。 在这种情况下, tmp
环境变量实际上是: "many \ ^ > ' characters and quotes"
,您可以简单地使用它:
FOR /F "delims=" %%1 IN (%tmp%) DO echo %%1
注意%1
而不是"%~1"
。 现在让它变得更加复杂。 如果你的字符串中需要双引号,那么有些字符不会被转义(例如&和| ),你可以直接删除引号:
set "tmp=many \ ^ > ' | & characters and quotes"
用过的:
FOR /F "delims=" %%1 IN ("%tmp%") DO echo %%1
要么
FOR /F "delims== tokens=2" %%1 IN ('set tmp') DO echo %%1
如果指定usebackq
选项,不要忘记你可以使用backtips来分隔FOR
字符串。 您可以使用临时文件或更好的…一个PowerShell脚本…
Call
做^
时髦的事情,但这个工程。
@echo off set "var=a string with an ^> arrow" call :SomeFunction pause goto:eof :SomeFunction echo %var% goto:eof
像foxidrive提到的那样,CALL会修改插入符号,所以不可能建立一个防弹的方式来通过CALL值传递参数。
但是你可以通过引用来使用参数。
@echo off set "var=a string with a caret^ and an > arrow" call :SomeFunc var exit /b :SomeFunc setlocal EnableDelayedExpansion set "param1=!%1!" echo !param1! exit /b
我在这里使用延迟扩展,因为这是以安全方式处理任何可变内容的最佳方式