使用forfiles和7zip的文件名中的空格

时间:2011-05-25 06:52:17

标签: windows command-line cmd space 7zip

我正在编写一个脚本来压缩旧文件,使用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 个答案:

答案 0 :(得分:2)

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

引用可能是令人抓狂的经历,即使对于有shell和bat脚本经验的人也是如此。

@ BugFinder的msg是合适的,我想补充说3个dbl-quotes是“引用”单个双引号char的一种方式。

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

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

然后按Enter键。命令处理器不仅会开始执行您提交的命令,还会扫描该行,查找特殊大小写字符和符号,如变量名称。在Unix shell中,环境变量看起来像$varName${varName}。在.bat文件%var%%%v%%中。该变量必须转换为值。

这只是命令处理器制作的一个传递,还有其他传递。但是根据您的需要,cmd处理器正在扫描应该作为一个单词的单词集。如果你有一个var="one two",那么用引号围绕值边会混淆任何必须处理它的命令。它看起来像var=one .... two(单词,对吧?)。

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

正如“单词”是引用的单词一样,"""是引用的双引号。在命令处理器正常处理引号之后,中间双引号仍将保留在命令行的命令处理器的“视图”中(在变量扩展之后,处理规则的所有其他顺序都已经过其次。)

呼!

所以要把它包起来,你在评论中写道

  

但是""" - > "" - > "

不,""" => "

  

那为什么一个引用不够?

因为使用"""是让命令处理器留下一个独立的双引号字符的一种方法,所以字符保留在命令行中而不会爆炸。

  

或者第一个浓缩双引号是否会获得某种神奇的力量?

没有神奇的力量,请注意你的命令后来有"""秒。每组都留下1 "字符以便以后处理。

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

最后,根据belisarius写的优秀提醒,

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

来接受更好地解决问题的答案(如果有的话)

我希望这会有所帮助。

答案 1 :(得分:1)

快速猜测,就像许多事情“”“=”,例如2引号围绕引号......“也可能已经足够了。”

答案 2 :(得分:0)

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

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

start /max /d"C:\Program files\foo\" ba.exe -somearguments