4

我正在编写一个脚本来压缩旧文件,使用 forfiles 进行循环,使用 7za 进行压缩。我一直在努力解决如何处理文件名中的空格,虽然我找到了一个似乎可行的解决方案,但不明白为什么我对将其部署到生产环境感到紧张。

这是似乎有效的命令:

forfiles -p%rootLogDir% -s -m*.log -d-14 -c"cmd /c 7za a -tzip """@PATH\@FILE-%date%.zip""" """@PATH\@FILE""""

请注意,7za 的路径和文件名参数有 3 组(是的,3 组)引号。一组引号什么都不做,两组引号导致脚本将目录中的每个文件都添加到存档中,而不是指定的一个,并且三个似乎可以工作。

谁能解释为什么需要这么多?我会认为在一组之后剩下的都是多余的,但显然我错了。

4

3 回答 3

2

forfiles是 cmd.exe 子命令吗?如果是这样,您应该使用许多可用的(MS)windows 标记之一重新标记您的问题。)

引用可能是一种令人抓狂的经历,即使对于在 shell 和 bat 脚本方面有丰富经验的人来说也是如此。

@BugFinder 的消息是合适的,我要补充一点,3 dbl-quotes 是“引用”单个双引号字符的一种方式。

您正在“使用”命令处理器(cmd.exe?)。您键入一个命令(带有 1 个或多个单词或运算符),即

myCommand /s /d %dir% file1 file2 > sumFile

然后按回车键。命令处理器不只是开始执行您提交的命令,它扫描行,寻找特殊的单词和符号,如变量名。在 Unix shell 中,环境变量看起来像$varName${varName}。在 .bat 文件%var%%%v%%. 该变量必须转换为值。

这只是命令处理器进行的一次传递,还有其他传递。但是为了您的需要,cmd 处理器正在扫描应该被视为一个单词的单词集。如果你有一个var="one two", 没有用引号包围值的一面,将会混淆任何必须处理它的命令。它看起来像var=one .... two(单独的词,对吗?)。

因此,如果由于某种原因您需要通过双引号字符传递到较低层的处理,则必须遵循命令处理器规则,根据需要引用内容,然后一切都会正常。

正如“word”是一个带引号的单词一样,"""也是一个带引号的双引号。在命令处理器对引号进行正常处理后,中间的双引号仍将保留在命令处理器对命令行内容的“视图”中(变量扩展后,所有其他处理规则的顺序都已紧随其后。)

哇!

所以总结一下,你在评论中写道

但是然后"""-> ""-> "

不,"""=>"

那么为什么一个报价是不够的呢?

因为 using"""是让命令处理器将独立的双引号字符保留在命令行上而不会崩溃的一种方法。

还是第一个浓缩双引号获得了某种神奇的力量?

没有神奇的力量,请注意您的命令有一个较晚"""的 s。每组留下 1 个"字符供以后处理。

正如@BugFinder 指出的那样,\"可能就足够了,但我不确定您使用的是哪个命令处理器或外壳,所以我无法运行测试。

最后,根据贝利撒留的精彩提醒,

请允许我欢迎您使用 StackOverflow 并提醒我们通常在这里做的三件事:1)当您获得帮助时,也尝试给予帮助,回答您专业领域的问题 2)阅读常见问题解答,http ://tinyurl.com/ 2vycnvr , 3) 当你看到好的 Q&A 时,使用灰色三角形给他们投票, http: //i.stack.imgur.com/kygEP.png,因为系统的可信度是基于用户获得的声誉分享他们的知识。还记得通过按下复选标记来接受更好地解决您的问题的答案, http: //i.stack.imgur.com/uqJeW.png

我希望这有帮助。

于 2011-05-27T03:38:09.113 回答
1

快速猜测一下,就像许多“”“=”一样,例如2个引号围绕一个引号..一个“\”可能也足够了。

于 2011-05-25T06:59:18.920 回答
0

所有包含空格的文件名和路径都必须用引号引起来。

接下来,关于您的问题,如何说明如下路径:

start /max /d"C:\Program files\foo\" ba.exe -somearguments
于 2019-04-26T02:43:33.443 回答