在Powershell脚本中运行7-Zip

50

我正尝试在 Powershell (v2) 脚本中使用 7-Zip 来备份一些文件。

我有:

$zipPath = "C:\Program Files\7-Zip\7z.exe"
[Array]$zipArgs = "-mx=9 a", "`"c:\BackupFolder\backup.zip`"", "`"c:\BackupFrom\backMeUp.txt`""

&$zipPath $zipArgs;

但是当我运行这个时,我得到了:

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18


Error:
Incorrect command line

将此写入屏幕,我得到:

C:\Program Files\7-Zip\7z.exe -mx=9 a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt"

所以我假设需要在7z.exe的路径周围添加引号,这给了我:

$zipPath = "C:\Program Files\7-Zip\7z.exe"
$zipPath = " `"$zipPath`" "
[Array]$zipArgs = "-mx=9 a", "`"c:\BackupFolder\backup.zip`"", "`"c:\BackupFrom\backMeUp.txt`""

&$zipPath $zipArgs;     

但是我收到以下错误:

    The term '"C:\Program Files\7-Zip\7z.exe"' is not recognized as the name of a cmdlet, function, script file
, or operable program. Check the spelling of the name, or if a path was included, verify that the path is c
orrect and try again.
At C:\BackupScript\Backup.ps1:45 char:22
+                     & <<<< `"$zipPath`" $zipArgs;                    
    + CategoryInfo          : ObjectNotFound: ("C:\Program Files\7-Zip\7z.exe":String) [], CommandNotFound 
   Exception
    + FullyQualifiedErrorId : CommandNotFoundException

将其写出来,我得到:

"C:\Program Files\7-Zip\7z.exe" -mx=9 a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt"

如果直接粘贴到命令窗口中,它可以正常工作。 我已经尝试了一段时间,但是我想我可能错过了什么(很可能很明显的东西)。 有人可以看到我需要做什么才能使其运行吗?


2
我最近写的一篇文章可能会有所帮助:在PowerShell中运行可执行文件。尝试使用& "C:\Program Files\7-Zip\7z.exe" "-mx=9" a C:\BackupFolder\Backup.zip C:\BackupFrom\backMeUp.txt - Bill_Stewart
谢谢,这是一篇有趣的文章。我稍后需要认真阅读一下。我觉得你可能有答案。而我之前写的是"-mx=9 a",但我需要的是"-mx=9" a。我无法使用$zipArgs变量使其工作,但可以使用& "$zipPath" "-mx=9" a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt" - IGGt
为了防止PowerShell将“-mx=9”解释为运算符,可以使用引号或使用反引号转义参数(如文章中所述)。 - Bill_Stewart
尝试执行&$zipPath @zipArgs - groser
7个回答

82

找到了 这个 脚本并按照你的需求进行了调整。请尝试一下:

$7zipPath = "$env:ProgramFiles\7-Zip\7z.exe"

if (-not (Test-Path -Path $7zipPath -PathType Leaf)) {
    throw "7 zip file '$7zipPath' not found"
}

Set-Alias Start-SevenZip $7zipPath

$Source = "c:\BackupFrom\backMeUp.txt"
$Target = "c:\BackupFolder\backup.zip"

Start-SevenZip a -mx=9 $Target $Source

谢谢你的帮助,我已经解决了。如果我不熟悉这个语法,我需要花一些时间来学习它(学习新方法总是好的)。谢谢! - IGGt
非常巧妙的别名操作,这真的有助于使对7z的调用更加容易。谢谢! - Dan Atkinson
1
虽然我并不是在建议别名总是好的,但人们也可以称它为“7z”。set-alias 7z "$env:ProgramFiles\7-Zip\7z.exe" - lit
文档位于https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm。它们帮助我弄清楚了我需要进入目录以避免将父文件夹复制到zip中。 - Negatar

16

在7z命令之前放置"&"特殊字符。例如:&7z ...


14

只需在命令前面加上&符号即可

& "C:\Program Files\7-Zip\7z.exe" -mx=9 a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt"

3
也许更简单的解决方案是通过cmd在您的Powershell上运行7-zip:
cmd /c 7za ...

我可能会尝试一下!我注意到ps的$LASTEXITCODE [1]也应该得到漂亮的返回代码[2]。; Refs. 1.[]; X.从CMD返回错误代码到Powershell-Stack Overflow;; https://dev59.com/sGTWa4cB1Zd3GeqPHuXU; 2.[]; X.来自7-Zip的退出代码;; http://sevenzip.sourceforge.jp/chm/cmdline/exit_codes.htm - AnneTheAgile

2
如果您正确地适应它:不要忘记在“$Target”上加上"",并避免在路径中有空格的c:\programm files中使用$7zipPath。
Set-Alias 7zip $7zipPath

$Source = "c:\BackupFrom\backMeUp.txt"
$Target = "c:\BackupFolder\backup.zip"

7zip a -mx=9 "$Target" "$Source"

或者
7z a "$ArchiveName" -t7z '@listfile.txt'

引号对我没用。我必须进入目录,以避免父文件夹被转储到归档中 https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm - Negatar

0
尝试使用参数-file来指定程序或脚本的位置:

-file "C:\Program Files\someting.exe"


0
C:\'Program files'\7-Zip\7z.exe a '$archiveFile'  -Path '$dest'

其中:

  • archiveFile = 存档文件名。
  • dest = 目标文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接