Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何在bash脚本批处理文件的参数中包含管道字符?_Batch File_Cygwin - Fatal编程技术网

Batch file 如何在bash脚本批处理文件的参数中包含管道字符?

Batch file 如何在bash脚本批处理文件的参数中包含管道字符?,batch-file,cygwin,Batch File,Cygwin,我有一个shell脚本,我想执行这一行: qtvars.bat vsstart "qt.sln" /BUILD "Debug|Win32" 这很好(虽然我不得不修改qtvars.bat,但这不是重点)。问题是,我希望命令在变量中执行: 编辑:如果我在bash中键入它,这也不起作用。以前我把它输入到cmd.exe,这很难进行公平的比较 command="qtvars.bat" args="vsstart" $command $args "qt.sln" /BUILD "Debug|Win32"

我有一个shell脚本,我想执行这一行:

qtvars.bat vsstart "qt.sln" /BUILD "Debug|Win32"
这很好(虽然我不得不修改
qtvars.bat
,但这不是重点)。问题是,我希望命令在变量中执行: 编辑:如果我在bash中键入它,这也不起作用。以前我把它输入到
cmd.exe
,这很难进行公平的比较

command="qtvars.bat"
args="vsstart"

$command $args "qt.sln" /BUILD "Debug|Win32"
现在它被管子堵住了!我得到这个信息:

'Win32' is not recognized as an internal or external command,
operable program or batch file.
我尝试了很多形式的转义引号和/或管道,但都没有效果。有趣的是,当它是可执行文件而不是批处理文件时,它可以工作,例如:

command="devenv.exe"
args=""

$command $args "qt.sln" /BUILD "Debug|Win32"

谢谢你的建议。

这是双重转义的经典案例,其中需要指示bash和CMD.EXE忽略特殊的|(管道)字符

请尝试以下操作:

$command $args "qt.sln" /BUILD '"Debug|Win32"'
这相当于在CMD.EXE提示符下键入:

qtvars.bat vsstart qt.sln /BUILD "Debug|Win32"
qtvars.bat vsstart qt.sln /BUILD Debug\|Win32
使用上述方法,您实际上是在强制将双引号传递到CMD.EXE(而不是bash吃掉它们);内部双引号指示CMD.EXE忽略其中的任何特殊字符(本例中为管道)

或者,您也可以尝试:

$command $args "qt.sln" /BUILD 'Debug\|Win32'
这相当于在CMD.EXE提示符下键入:

qtvars.bat vsstart qt.sln /BUILD "Debug|Win32"
qtvars.bat vsstart qt.sln /BUILD Debug\|Win32

注意单引号(!)的使用,它确保bash不会解释\(而是将其原样传递给CMD.EXE。)

有趣!转义
|
有什么作用

这些有用吗

  • 回显“调试| Win32”
  • echo“qt.sln”/BUILD“Debug | Win32”
我发现了另一个解决方案(解决方案?):

首先,确保环境变量定义管道字符,例如:
set PIPE=“|”

稍后,运行指定上述定义的环境变量名称的命令:
“c:\(…)\devenv.com”foo.sln/build Debug%PIPE%Win32

即使调用者和被调用者之间有多个包装器,这也可以完成任务。我现在将它与一条很长的包装链一起使用: Python/Linux->VirtualBox来宾的executeProcess->Cmd/Windows->devenv.com

(交叉发布到:)

我知道您在批处理文件中使用“^”字符“转义”管道字符,因此

回显这里的一些文字^|

将显示

|这里有一些文字|


我不知道在这种情况下这是否对你有帮助?也许可以尝试在每个管道字符前面加一个“^”,看看会发生什么?:-)

用插入符号(^)对Windows脚本语言中的管道字符进行转义。前几天我不得不这么做。我知道这是旧的,但我想我会发布我发现的,以防其他人遇到这个问题,就像我一样。

我会考虑走简单的路线,然后传递占位符代号“$p”,然后在CMD/BAST文件中替换它。e、 g.使用“UnxUtils”SEd命令进行替换:

For /F "usebackq delims=" %%r in (`Echo %Cmd% ^| sed -e "s/$P/|/g"`) do @Set Cmd2=%%r

REM  Now run the command, with the proper pipe symbol in place

%Cmd2%

因此,在传递命令arg/CMD script args-“git status$p wc-l”之后,

尝试了这些。刚才又做了一次,确定无疑。它们会导致相同的错误,尽管有时在错误消息中“Win32”会变成“Win32\”。您的意思是:目的是什么?让bash或cmd.exe将|作为参数的一部分传递,而不是尝试将其作为管道语法处理。或者我的处境会有什么结果?没什么。我想知道使用escape的结果是什么?谢谢!我很感激。不知何故,我没有注意到之前的答案是这样说的,而你的答案让我回到了这里。