【问题标题】:Batch File: How to Double Quote a Command /C when the command itself needs Quotes批处理文件:如何在命令本身需要引号时双引号 /C
【发布时间】:2019-05-14 12:15:05
【问题描述】:

我正在制作一个 Windows 批处理文件来运行 7zip 命令行来压缩一组文件。下面脚本中/C之后的部分需要根据文档引用。问题来自文件路径周围已经有双引号。我是否需要 \ 转义某些引号,使用额外的引号,单引号?我试过的都没有用。

这是/c之后的命令部分:

/c "c:\program files\data\7-zip\7z" a "c:\program files\data\backups\test1.7z" "c:\program files\data\backups\test1.txt" -mmt1

整个脚本(如果需要):

forfiles /p "c:\program files\data\backups" /m *.txt /c "c:\program files\data\7-zip\7z" a "c:\program files\data\backups\test1.7z" "c:\program files\data\backups\test1.txt" -mmt1

【问题讨论】:

  • " 用于外部引号(整个命令行),0x22 用于内部“引号”(仅forfiles 专用!):`forfiles .... /c "0x22c:\文件夹\7z.exe0x22 a 0x22c:\....7z0x22 0x22c:\....txt0x22 -mmt1"
  • 当你不使用@file@path 的任何变量时,为什么还要使用forfiles
  • 打开命令提示符,输入forfiles /? 阅读其使用信息。您会清楚地看到/C 选项后面的命令字符串应该用双引号引起来。该命令字符串本身中的任何双引号都可以替换为等效的十六进制字符串0x22,例如FORFILES /P "C:\Program Files\data\backups" /M *.txt /C "0x22C:\Program Files\data\7-zip\7z.exe0x22 a 0x22C:\Program Files\data\backups\test1.7z0x22 0x22C:\Program Files\data\backups\test1.txt0x22 -mmt1"。但是,如果从 For 循环运行会更有效,输入 for /? 以了解其用法等。
  • 尝试一个简单的for 循环,例如:for %%a in ("c:\program files\data\backups\*.txt") do echo %%aforfiles 不是用户友好...
  • forfiles 是一个讨厌的野兽,因为它没有按照here 的描述正确处理/C 命令行参数;所以@Stephan 使用0x22 的建议可能仍然会因为那个设计缺陷而失败......

标签: windows batch-file 7zip forfiles


【解决方案1】:

我遇到了同样的问题,这里是我如何解决这个问题的一个概念:

@FORFILES /s /m *.ext /c "cmd /c \"\"C:\Program Files\Blah\blah-blah-blah.exe\" -o1 --option2 /option3 @file\"" >%~n0.log 2>&1

相当棘手,但它有效!

【讨论】:

  • 你是我的救命稻草,谢谢,它有效!回显时使用 0x22 的建议看起来正确,但最终命令仍会由于未知原因丢失双引号,但使用 \" 是这里的关键。
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 2019-05-11
  • 2013-08-31
  • 2014-12-25
  • 2012-11-23
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多