50

I'm trying to use 7-Zip to backup some files inside a Powershell (v2) script.

I have:

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

&$zipPath $zipArgs;

But when I run this I get:

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


Error:
Incorrect command line

Writing this to the screen I get:

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

So I assumed that I needed to put quotes around the path to 7z.exe, that gave me:

$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;     

But then I get the following error:

    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

Writing it out gives me:

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

Which works as expected when pasting straight into a command window. I have been trying to figure this out for a while, but assume I am missing something (probably quite obvious). Can anybody see what I need to do to make this run?

IGGt
  • 2,627
  • 10
  • 42
  • 63
  • 2
    An article I wrote recently may be helpful: [Running Executables in PowerShell](http://windowsitpro.com/powershell/running-executables-powershell). Try `& "C:\Program Files\7-Zip\7z.exe" "-mx=9" a C:\BackupFolder\Backup.zip C:\BackupFrom\backMeUp.txt`. – Bill_Stewart Aug 13 '14 at 14:37
  • Cheers, that's an interesting article. I'll need to have a proper read later. I think that you may have the answer. Whereas I had `"-mx=9 a"` what I needed was `"-mx=9" a`. I can't make it work with $zipArgs variable, but it does work with `& "$zipPath" "-mx=9" a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt"` – IGGt Aug 13 '14 at 15:03
  • Correct; to prevent PowerShell from interpreting `-mx=9` as an operator, use quotes or escape the parameter with a backtick (as explained in the article). – Bill_Stewart Aug 13 '14 at 15:20
  • Try `&$zipPath @zipArgs` – groser Oct 01 '20 at 06:55

7 Answers7

82

Found this script and adapted it to your needs. Can you please try:

$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
DarkLite1
  • 13,637
  • 40
  • 117
  • 214
  • Cheers for that. I got that working. I'll need to spend some time with that syntax is I'm not familiar with it (it's always good to learn new ways of doing things). cheers – IGGt Aug 13 '14 at 15:06
  • Nice cheeky bit of alias work there which really helps make calls to 7z much easier. Thanks! – Dan Atkinson Oct 08 '15 at 13:05
  • 1
    While I am not suggesting that aliases are always a good thing, one could also call it `7z`. `set-alias 7z "$env:ProgramFiles\7-Zip\7z.exe"` – lit Oct 09 '16 at 12:47
  • Docs at https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm. They helped me figured out that I needed to cd into the directory to avoid parent folders being copied to the zip. – Negatar May 07 '21 at 21:50
15

put "&" special character before 7z command. Example: &7z ...

Ric
  • 151
  • 1
  • 2
14

Simply prefix the command with an ampersand

& "C:\Program Files\7-Zip\7z.exe" -mx=9 a "c:\BackupFolder\backup.zip" "c:\BackupFrom\backMeUp.txt"
OldBuildingAndLoan
  • 2,801
  • 4
  • 32
  • 40
scarba05
  • 2,943
  • 1
  • 27
  • 29
3

Maybe a simpler solution is to run 7-zip on your Powershell via cmd:

cmd /c 7za ...
Lars Bilke
  • 4,940
  • 6
  • 45
  • 63
  • I might try it! I notice ps's $LASTEXITCODE [1] should get the nice return code [2] too. ; Refs. 1.[] ; X.Returning an error code from CMD to Powershell - Stack Overflow ;; http://stackoverflow.com/questions/11004666/returning-an-error-code-from-cmd-to-powershell ; 2.[] ; X.Exit Codes from 7-Zip ;; http://sevenzip.sourceforge.jp/chm/cmdline/exit_codes.htm – AnneTheAgile Jan 25 '15 at 18:08
2

If you adapt it correctly: Dont forget the "" on "$Target" and avoid $7zipPath in c:\programm files with a space in the path

Set-Alias 7zip $7zipPath

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

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

or

7z a "$ArchiveName" -t7z '@listfile.txt'
EPO
  • 21
  • 1
  • Quotes didn't work for me. I had to cd into the directory to avoid the parent folders being dumped into the archive https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm – Negatar May 07 '21 at 21:49
0

try to use parameter -file to specify the location of program or script:

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

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

where:

  • archiveFile = name of the archive file name.
  • dest = destination folder.
the Tin Man
  • 158,662
  • 42
  • 215
  • 303