Frage

Ich versuche, einen PowerShell-Befehl auszuführen, um 7-Zip anzurufen, um einen Ordner mit dem folgenden Befehl aufzuteilen:

$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Invoke-Expression $command

Die Variablen, die in $ befehlten, sind bereits festgelegt und $ Sevenzip ist "C: Programme 7-Zip 7z.exe".

Dies funktioniert nicht und ich versuche, den besten Weg zu ermitteln, um 7-Zip von Powershell zu rufen. Ideen?

War es hilfreich?

Lösung

Ich hatte das gleiche Problem schon einmal. Dies ist Code (fast) direkt aus einem Sicherungsskript, das ich derzeit verwende:

[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe";
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath;

& $pathToZipExe $arguments;

Ich habe mich an die Gewohnheit gemacht, ein Argument -Array mit dem Anrufbetreiber zu verwenden, es scheint robuster zu sein als andere Methoden.

Andere Tipps

Sie müssen nicht die Invoke-Ausdruck verwenden & So rufen Sie eine Zeichenfolge auf, die einen Befehl zum Ausführen nennt. Beachten Sie, dass Sie die Parameter in diesem Fall getrennt halten möchten, dh der String Sevenzip sollte nur der Pfad zum exe zB sein:

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName

Sie müssen eigentlich keinen Ausdruck aufrufen. Sie können den Befehl einfach aufrufen, indem Sie das Ampersand verwenden, z. B.:

&$Command

Aber es gibt auch das Startprozess-CMDLet, das besser für das geeignet ist, was Sie versuchen zu tun. Durch die Ausführung des Befehls als Zeichenfolge oben sind Sie anfällig für Fehler, wenn der $ Sevenzip Leerzeichen enthält und nicht zitiert wird. Stattdessen würde ich verwenden:

Start-Process $SevenZip "...rest..."

Ich bin auch auf dieses Problem gestoßen, hier war meine Lösung.

invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log "

Ich konnte meine Paramater außerhalb der einzelnen Zitate lassen, die auf mein Exe zeigten. Ich denke, dies ist wahrscheinlich der einfachste Weg, ein Exe mit Parametern mithilfe von Invoke-Expression aufzurufen.

Lassen Sie mich raten, es versucht, "C: Programm" aufzurufen?

Ich bin mir der richtigen Syntax für PS nicht sicher, aber Sie müssen etwas gegen diesen Raum tun.

Funktioniert bei mir:

$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName

Write-Host "Running: $command"

Invoke-Expression $command

Sie können auch MS-DOS-Befehle in einem Windows PowerShell-Skript verwenden.

Ich habe den Befehl von CMD.exes Start immer geliebt, mit dem Sie einen Befehl parallel starten können.

Um Ihren 7-Zip zu starten, geben Sie den folgenden Befehl in Ihr PowerShell-Skript ein:

    cmd.exe /c start <your 7-zip command like in MS-DOS> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top