如何将重定向符号(<和>)传递给Windows批处理文件函数?

Tom*_*lak 8 windows cmd batch-file

假设这个批处理文件

call :SomeFunction "a string with an > arrow"

goto:eof

:SomeFunction
  echo %~1
goto:eof
Run Code Online (Sandbox Code Playgroud)

这个的输出是

call :SomeFunction "a string with an > arrow"
echo a string with an  1>arrow
goto:eof
goto:eof

arrow创建一个包含的名为的文件a string with an.请注意1>.

>在这种情况下,如何防止命令处理器将其解释为重定向符号?(提示:我已经尝试过了^>,不是吗.)

编辑:其他运营商(|&)当然也受到影响.

Adr*_*tti 6

您可以使用FOR /F命令,而不是:

echo %~1
Run Code Online (Sandbox Code Playgroud)

用这个:

FOR /F "delims=" %%i IN ("%~1") DO echo %%i
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,现在您需要在传递用双引号分隔的参数时处理奇怪的转义行为.例如,"a^2"将被转义"a^^2",如果您尝试使用"a^^2"或没有问题"a\^2".您可以做什么(来自您自己的评论)是使用临时变量并进行转义(然后删除双引号):

set TEMP=%TEMP:>=^>%
Run Code Online (Sandbox Code Playgroud)

如果您不想关心逃避,您也可以尝试:

set "tmp="many \ ^ > ' characters and quotes""
Run Code Online (Sandbox Code Playgroud)

注意双引号括起set参数和字符串中的许多特殊字符.在这种情况下,tmp环境变量实际上是:"many \ ^ > ' characters and quotes",您可以简单地将其用作:

FOR /F "delims=" %%1 IN (%tmp%) DO echo %%1
Run Code Online (Sandbox Code Playgroud)

注意%1而不是"%~1".现在让它变得更复杂.如果你需要双引号"的字符串中那么一些字符将不会进行转义(&|举例).您可以简单地删除引号:

set "tmp=many \ ^ > ' | & characters and quotes"
Run Code Online (Sandbox Code Playgroud)

用过的:

FOR /F "delims=" %%1 IN ("%tmp%") DO echo %%1
Run Code Online (Sandbox Code Playgroud)

要么

FOR /F "delims== tokens=2" %%1 IN ('set tmp') DO echo %%1
Run Code Online (Sandbox Code Playgroud)

FOR如果指定usebackq选项,请不要忘记可以使用backtips来分隔字符串.您可以使用临时文件或...更好... PowerShell脚本...