5 Stimmen

Powershell, das unter einem Dienst ausgeführt wird, bleibt bei *.zip CopyHere hängen

Ich führe einen Windows-Dienst (Hudson) aus, der wiederum einen PowerShell-Prozess startet, um meine benutzerdefinierten PowerShell-Befehle auszuführen. Ein Teil meines Skripts besteht darin, eine Datei mit CopyHere zu entpacken. Wenn ich dieses Skript lokal ausführe, wird ein Fortschrittsdialog angezeigt, während die Dateien extrahiert und kopiert werden. Wenn es jedoch unter dem Dienst ausgeführt wird, bleibt es an der Stelle hängen, an der sonst ein Dialogfeld angezeigt würde.

Hier ist der Teil meines Skripts zum Entpacken.

# Extract the contents of a zip file to a folder
function Extract-Zip {
    param([string]$zipFilePath, [string]$destination)
    if(test-path($zipFilePath))     {   
        $shellApplication = new-object -com shell.application

        $zipFile = get-item $zipFilePath
        $zipFolder = $shellApplication.NameSpace($zipFile.fullname)

        $destinationFile = get-item $destination
        $destinationFolder = $shellApplication.NameSpace($destinationFile.fullname)

        $destinationFolder.CopyHere($zipFolder.Items())
    }
}

Ich vermute, dass aufgrund der Tatsache, dass es unter einem Dienstprozess läuft, der kopflos ist (keine Interaktion mit dem Desktop), es irgendwie feststeckt und versucht, einen Dialog anzuzeigen.

Gibt es eine Möglichkeit, dies zu umgehen?

0 Stimmen

Haben Sie das Powershell-Plugin für Hudson ausprobiert? Vielleicht hilft das ja.

3voto

Iurii Punkte 41

Wenn es immer noch aktuell ist, habe ich es geschafft, dies zu beheben, indem ich CopyHere params gleich 1564 gesetzt habe.

In meinem Fall sieht die Funktion extract zip wie folgt aus:

    function Expand-ZIPFile{
    param(
    $file, $destination
    )
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file)
    foreach($item in $zip.items())
    {
    $shell.Namespace($destination).copyhere($item,1564)
    "$($item.path) extracted"
    }

1564 Beschreibung kann hier gefunden werden - http://msdn.microsoft.com/en-us/library/Windows/desktop/bb787866(v=vs.85).aspx :

(4) Zeigen Sie kein Fortschrittsdialogfeld an.
(8) Geben Sie der zu bearbeitenden Datei bei einem Verschiebe-, Kopier- oder Umbenennungsvorgang einen neuen Namen, wenn bereits eine Datei mit dem Zielnamen existiert.
(16) Beantworten Sie jedes angezeigte Dialogfeld mit "Ja zu allen".
(512) Bestätigen Sie die Erstellung eines neuen Verzeichnisses nicht, wenn der Vorgang die Erstellung eines Verzeichnisses erfordert.
(1024) Keine Benutzeroberfläche anzeigen, wenn ein Fehler auftritt.

2voto

Keith Hill Punkte 183005

Wenn das Programm unter Vista oder Windows 7 läuft, wird die auftauchende Benutzeroberfläche eines Dienstes vom Endbenutzer nicht so gesehen, wie Sie vermutet haben. Siehe dieses Papier über Sitzung 0 Isolierung . Erfordert der Fortschrittsdialog jedoch eine Benutzereingabe? Wenn nicht, würde ich nicht denken, dass dies den Dienst zum Hängen bringen würde. Ich würde nach einer Option zur Deaktivierung der Fortschrittsanzeige suchen. Wenn Sie diese nicht finden können, versuchen Sie, zu einem anderen ZIP-Extraktor zu wechseln. PSCX 1.2 verfügt über ein Cmdlet "Expand-Archive". Ich bin sicher, dass es auch andere gibt.

0 Stimmen

Der Fortschrittsdialog sollte keine Benutzereingaben erfordern. Wenn ich es von einer Eingabeaufforderung aus ausführe, ist das nicht der Fall - es wird nur der Fortschrittsdialog angezeigt, ohne dass eine Eingabe erforderlich ist, und dann verschwindet der Dialog, wenn er fertig ist. Der eigentliche Fortschrittsdialog wird von der CopyHere-Methode ausgelöst. Angeblich gibt es Optionen, die Sie übergeben können sollten, um jede potenzielle Interaktion zu blockieren, aber es gibt Dutzende von Beiträgen, die sich darüber beschweren, dass PowerShell diese speziellen Optionen ignoriert. Ich hatte gehofft, 3rd-Party-Zeug so weit wie möglich zu vermeiden, aber vielleicht muss ich nachgeben.

0 Stimmen

PSCX bietet Wrapper-Cmdlets für 7-Zip an, aber wenn Sie möchten, können Sie 7-Zip auch direkt verwenden. 7-zip.org

1voto

Michael Donohue Punkte 11704

Die Betrachtung der Dokumentation für PowerShell, sieht es so aus, als ob die -Nicht interaktiv Option kann hier helfen

0 Stimmen

Das würde verhindern, dass PowerShell eine Eingabeaufforderung anzeigt, aber ich glaube nicht, dass es die Windows-Shell daran hindert, die Benutzeroberfläche anzuzeigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X