Cygwin:使用参数,输出重定向和复杂的Windows路径调用批处理文件

时间:2019-04-29 08:25:02

标签: bash batch-file cygwin

我如何使用Cygwin在Cygwin下从bash脚本调用批处理文件,

  • 批处理文件的绝对路径
  • 代表绝对(Windows)路径的批处理文件参数
  • 将重定向输出到绝对路径的文件中

哪里...

  • 所有路径都可能包含空格和特殊字符,例如括号
  • bash脚本中所有路径最初仅以Unix格式出现吗?

我有一个Windows批处理脚本C:\ Program Files(x86)\ bin \ script.bat,它将输入文件的(windows)路径作为参数-示例:

@ECHO OFF
echo "This is script.bat. The value of the first argument is [%~1]"

我想将script.bat的输出重定向到另一个绝对路径的输出文件中。

在Windows命令提示符(cmd.exe)上,我将这样调用该命令:

C:\> "C:\Program Files (x86)\bin\script.bat" "C:\Input Path\input.txt" > "C:\Output Path\output.txt"
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

如果我应用“批处理样式转义”,则可以省略脚本和重定向目标周围的双引号,但这不适用于该参数(由于某些原因):

C:\> C:\Program^ Files^ ^(x86^)\bin\script.bat "C:\Input Path\input.txt" > C:\Output^ Path\output.txt
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

...但是:

C:\> C:\Program^ Files^ ^(x86^)\bin\script.bat C:\Input^ Path\input.txt > C:\Output^ Path\output.txt
output.txt: This is script.bat. The value of the first argument is [C:\Input].

我还可以将命令包装到对cmd.exe的附加调用中,在整个术语周围使用附加双引号:

C:\> cmd.exe /C ""C:\Program Files (x86)\bin\script.bat" "C:\Input Path\input.txt" > "C:\Output Path\output.txt""
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

C:\> cmd.exe /C "C:\Program^ Files^ ^(x86^)\bin\script.bat "C:\Input Path\input.txt" > C:\Output^ Path\output.txt"
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

我还可以将输出重定向应用于外部cmd.exe实例:

C:\> cmd.exe /C ""C:\Program Files (x86)\bin\script.bat" "C:\Input Path\input.txt"" > "C:\Output Path\output.txt"
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

C:\> cmd.exe /C "C:\Program^ Files^ ^(x86^)\bin\script.bat "C:\Input Path\input.txt"" > C:\Output^ Path\output.txt
output.txt: This is script.bat. The value of the first argument is [C:\Input Path\input.txt].

到目前为止,一切都很好。但是,如何在Cygwin下从bash脚本调用上述任何命令行?

所有路径最初仅以Unix格式存在:

#!/bin/sh
BIN_UNIX="/cygdrive/c/Program Files (x86)/bin/script.bat"
ARG_UNIX="/cygdrive/c/Input Path/input.txt"
OUT_UNIX="/cygdrive/c/Output Path/output.txt"

请注意,调用脚本时文件$ OUT_UNIX不存在(因此'cygpath --dos ...'不起作用)。

我已经尝试了数十种或多或少笨拙的Unix / Windows路径组合(使用cygpath转换),无引号,单引号,双引号,无转义,“ bash样式”转义,“ batch样式”转义等等。我能找到的唯一可行的解​​决方案取决于批处理脚本的8.3样式路径,该路径消除了空格和特殊字符:

#!/bin/sh
# [...]
BIN_DOS=$( cygpath --dos "${BIN_UNIX}" )
ARG_WIN=$( cygpath --windows "${ARG_UNIX}" )
cmd /C "${BIN_DOS}" "${ARG_WIN}" > "$OUT_UNIX"

但是必须有一种更系统,更强大的方法来做到这一点,对吧?


所有未能完全回答我问题的相关问题:

Why is it that Cygwin can run .bat scripts?

Windows batches in Cygwin with spaces in path and arguments

correct quoting for cmd.exe for multiple arguments

How to Pass Command Line Parameters with space in Batch File

1 个答案:

答案 0 :(得分:3)

您可以使用

BIN_WIN=$( cygpath --windows "${BIN_UNIX}" )
ARG_WIN=$( cygpath --windows "${ARG_UNIX}" )
OUT_WIN=$( cygpath --windows "${OUT_UNIX}" )
cmd /c CALL "$BIN_WIN" "${ARG_WIN}" > "$OUT_WIN"

重要的一点是命令前面的CALL

cmd /c无法启动内部带有空格的命令,因为即使有引号,它也会拆分命令。

cmd /c也可以在没有CALL的情况下使用,但要加上附加的引号。

cmd /c "  "C:\Program Files (x86)\bin\script.bat" "args"   "

但是将原始引号从cygwin转移到cmd.exe似乎是不可能的,因为cygwin将引号转换为\",因此表达式变为

cmd /c \"  "C:\Program Files (x86)\bin\script.bat" "args"   \"