我正在编写一个函数来执行 shell 命令并在批处理脚本中捕获其输出。
:runShellCmd
setlocal EnableDelayedExpansion
SET lf=-
FOR /F "delims=" %%i IN ('%~1') DO if "%out%" == "" (set out=%%i) else (set out=!out!%lf%%%i)
echo "Cmd output: %out%"
SET "funOut=%out%"
ENDLOCAL & IF "%~1" NEQ "" SET %~2=%out%
goto :EOF
我已经成功地传递了简单的命令并获得了输出。但是对于像
这样的电话CALL :runShellCmd "echo Jatin Kumar | find/c/i "jatin""
它失败并出现错误 unexpected |字符
.
我知道我们需要在 for 中使用 ^
转义 |
但是如果我尝试在函数参数字符串中传递 ^|
,它将其更改为 ^^|
再次引发错误。
我错过了什么吗?
最佳答案
这是 CALL
命令的效果。
CALL
命令将批处理解析器阶段之一中的所有插入符号加倍。
通常你不会看到这一点,因为插入符将在加倍后直接用作转义字符。
看到这个
call echo ^^^^
call call echo ^^^^
call call call echo ^^^^
call echo "^^^^"
call call echo "^^^^"
call call call echo "^^^^"
输出
^^
^^
^^
"^^^^^^^^"
"^^^^^^^^^^^^^^^^"
"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
但是如何转义管道字符呢?
你不能!
但是您可以在您的函数中添加脱字符符。
:runShellCmd
setlocal EnableDelayedExpansion
set "param=%~1"
set param
set "param=!param:^^=^!"
for .... ('!param!')
或者您可以在调用函数时使用转义技巧。
set "caret=^"
CALL :runShellCmd "echo Jatin Kumar %%caret%%| find /c /i "
这是可行的,因为 %%caret%%
将在 CALL caret 加倍阶段
之后展开。
关于windows - 在函数调用窗口批处理脚本中转义 PIPE 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166295/