7z "Incorrect command line" 当我 运行 脚本位于与 C: 不同的驱动器中时

7z "Incorrect command line" when I run the script in a different drive than C:

我正在执行一个批处理脚本,以便我可以压缩特定文件夹中的多个目录。

问题是如果文件夹位于 C:\something,它会完美运行,但如果我尝试对 E:\something 中的文件夹执行相同操作,我会收到错误消息。

脚本是这样的:

@ECHO OFF
if %1.==. (
    SET "rootpath=%cd%"
) else (
    SET "rootpath=%~1"
)
FOR /D %%D IN ("%rootpath%\*") DO (
  7za a -t7z %%D.7z %%D\* -mx9
)

正常工作方式示例:

C:\Users\Me\Desktop\ExampleFolder>script
7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
Scanning
Creating archive C:\Users\Me\Desktop\ExampleFolder\D1.7z
Everything is Ok
7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
Scanning
Creating archive C:\Users\Me\Desktop\ExampleFolder\D2.7z
Everything is Ok

失败示例:

C:\Users\Me\ExampleFolder>script "E:\Documents\ExampleFolder"
Error:
Incorrect command line
Error:
Incorrect command line

当然,我也尝试在同一个文件夹中执行脚本,当我将位置作为参数传递时,我检查了它是否有效。谢谢。

试试这个批处理文件:

@echo off
set rootpath=c:\test
set strProgramFiles=%ProgramFiles%
if exist "%ProgramFiles(x86)%" set strProgramFiles=%ProgramFiles(x86)%
Set Path7z="%strProgramFiles%-zipz.exe"
echo %Path7z%
pause
CD /D "%rootpath%"
FOR /D %%D IN ("%rootpath%\*") DO (
  %Path7z% a -t7z %%D.7z %%D\* -mx9
)
pause

批号有2个错误

第一个是不确保分配给 rootpath 的路径不以反斜杠结尾,导致 %%D 包含具有两个连续反斜杠的路径。

由于此编码遗漏错误导致路径中的两个连续反斜杠取决于调用批处理时的参数字符串或批处理文件从驱动器的根目录执行时,因为在这种情况下 %cd% 扩展为包含以下内容的路径驱动器号、冒号和反斜杠。如果当前目录不是驱动器的根目录,%cd% 扩展为末尾没有反斜杠的路径。不过,这个错误并不严重。

第二个是使用包含关键字符(如 space 或以下字符之一的目录路径的真正问题:&()[]{}^=;!'+,`~

%%D.7z%%D\* 没有用双引号括起来,这使得 7za.exe 的参数列表无效,尤其是路径中有 1 个或多个 space 时。

我是怎么发现的?

我在 7za 左侧插入命令 echo 以查看循环中将执行什么。我没有安装 7-Zip,因此需要 echo 来测试批处理文件。

解决方法:

@echo off
if "%~1" == "" (
    set "RootPath=%CD%"
) else (
    set "RootPath=%~1"
)
if "%RootPath:~-1%" == "\" set "RootPath=%RootPath:~0,-1%"

for /D %%D in ("%RootPath%\*") do (
    7za.exe a -t7z "%%D.7z" "%%D\*" -mx9
)

如果此批处理文件始终在已知 7za.exe 路径的同一台计算机上执行,则最好在批处理文件中指定 7za.exe 并将完整路径括在双引号中。

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cmd /? ...至少阅读最后输出帮助页面的最后一段。
  • echo /?
  • for /?
  • if /?
  • set /?