如何将redirect符号(<和>)传递给Windowsbatch file函数?

假设这个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 

我在这里使用延迟扩展,因为这是以安全方式处理任何可变内容的最佳方式