7z"错误的命令行"当我在与C不同的驱动器中运行脚本时:

时间:2016-07-16 13:14:41

标签: batch-file 7zip

我正在编写批处理脚本,因此我可以压缩特定文件夹中的多个目录。

如果文件夹位于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

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

2 个答案:

答案 0 :(得分:1)

试试这个批处理文件:

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

答案 1 :(得分:1)

批处理代码中有2个错误。

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

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

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

%%D.7z%%D\*未包含在双引号中,因此7za.exe的参数列表无效,尤其是路径中包含1个或多个空格。

我是怎么发现的?

我在echo左侧插入了命令7za,以查看循环中将执行的内容。我没有安装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,并在批处理文件中用双引号括起完整路径。

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

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