windows - 在函数调用窗口批处理脚本中转义 PIPE 字符

标签 windows batch-file escaping call pipe

我正在编写一个函数来执行 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/

相关文章:

windows - 使用 Powershell 更改 Windows 'List separator'

windows - 如何删除批处理文件中的文件列表

batch-file - 批量计数 findstr 结果为/f

batch-file - 我的 for/f 语句有什么问题

javascript - 为什么这个字符串不可解析?

javascript - 如何在javascript下划线模板中转义<>?

.net - SQL 查询中的转义字符

windows - 在for循环中从 token 设置变量

windows - 如何让 grep 忽略 Windows 换行符?

batch-file - 使用批处理文件在批处理文件中的特定行之后插入新行