Cygwin下Bash脚本调用带路径参数与输出重定向的批处理文件
在Cygwin Bash中调用带特殊路径的Windows批处理:可靠方案
在Cygwin的Bash脚本里调用带空格、括号这类特殊字符的Windows批处理,核心是搞定路径格式转换和命令行参数的正确传递,我给你一套系统可靠的方案,完全不需要依赖8.3短路径:
关键认知纠正:cygpath不需要文件存在
很多人误以为cygpath必须目标文件存在才能转换路径,其实它只是做字符串层面的格式转换——不管文件/目录是否存在,都能把Unix风格的/cygdrive/c/xxx转换成Windows的C:\xxx。这直接解决了你提到的「输出文件不存在无法转换」的问题。
完整可运行代码
基于你的示例,修改成正确的调用逻辑:
#!/bin/sh # 初始的Unix格式路径(含空格、特殊字符) 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" # 转换为Windows格式路径:-w参数指定输出Windows风格路径 BIN_WIN=$(cygpath -w "$BIN_UNIX") ARG_WIN=$(cygpath -w "$ARG_UNIX") OUT_WIN=$(cygpath -w "$OUT_UNIX") # 核心调用逻辑:用cmd /c执行批处理,所有带特殊字符的路径用双引号包裹 cmd /c ""$BIN_WIN" "$ARG_WIN" > "$OUT_WIN""
逐行细节解释
- 路径转换:
cygpath -w "$PATH_UNIX"会把Unix路径转成标准Windows路径,比如/cygdrive/c/Program Files (x86)/bin/script.bat会变成C:\Program Files (x86)\bin\script.bat。这里用双引号包裹$PATH_UNIX,避免Bash把空格当成参数分隔符。 - 批处理调用:
cmd /c ""$BIN_WIN" "$ARG_WIN" > "$OUT_WIN""的外层双引号是给Bash用的,内层双引号是给Windows的cmd.exe用的——确保cmd能正确识别带特殊字符的路径。注意重定向符号>要放在cmd的命令串里,而不是Bash层面,否则Bash会用Unix路径规则处理重定向,导致错误。
为什么不推荐8.3短路径方案
8.3短路径(比如C:\PROGRA~2\bin\script.bat)确实能避开特殊字符问题,但它依赖Windows的短路径功能,部分系统可能禁用了该功能;而且短路径可读性极差,后期维护成本高,远不如cygpath+双引号的方案通用可靠。
测试验证
运行脚本后,打开C:\Output Path\output.txt,会看到批处理的输出内容:
"This is script.bat. The value of the first argument is [C:\Input Path\input.txt]"
完全符合预期。
内容的提问来源于stack exchange,提问作者rikinet
相关产品推荐
相关产品推荐

