2010-01-12 14 views
5

Używam usługi systemu Windows (Hudson), która z kolei spawnuje proces PowerShell, aby uruchomić moje niestandardowe polecenia PowerShell. Częścią mojego skryptu jest rozpakowanie pliku przy użyciu CopyHere. Kiedy uruchamiam ten skrypt lokalnie, pojawia się okno dialogowe postępu, gdy pliki są wyodrębniane i kopiowane. Jednak, gdy działa to pod usługą, zawiesza się w miejscu, w którym w przeciwnym razie pojawi się okno dialogowe.Powershell działa w ramach usługi zawiesza się na * .zip CopyHere

Oto rozpakuj część mojego skryptu.

# 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()) 
    } 
} 

Podejrzewam, że z powodu jego biegnący pod procesu obsługi, która jest bez głowy (bez interakcji z pulpitem), jej jakoś zatrzymany próbuje wyświetlić okno.

Czy istnieje sposób obejścia tego?

+0

Czy wypróbowałeś wtyczkę powershell dla Hudsona? Może to pomoże. –

Odpowiedz

1

Patrząc na documentation dla PowerShell, wygląda opcją -NonInteractive może pomóc tutaj

+0

Zapobiegnie to wyświetlaniu monitu programu PowerShell, ale nie sądzę, aby uniemożliwiło wyświetlanie interfejsu użytkownika przez powłokę systemu Windows. –

2

Jeśli ta działa na Vista lub Windows 7, pojawiały się UI z usługi nie będzie widać przez użytkownika końcowego, jak podejrzewasz. Zobacz ten artykuł na Session 0 Isolation. Czy jednak okno dialogowe postępu wymaga wprowadzenia danych przez użytkownika? Jeśli nie, nie sądzę, że spowodowałoby zawieszenie się usługi. Szukałbym opcji wyłączenia wyświetlania postępu. Jeśli nie możesz tego znaleźć, spróbuj przełączyć się do innego ekstraktora ZIP. PSCX 1.2 pochodzi z cmdletem Expand-Archive. Jestem pewien, że są też dostępne inne.

+0

Okno dialogowe postępu nie wymaga wprowadzania danych przez użytkownika. Kiedy uruchamiam go z wiersza poleceń, nie ma go - pokazuje tylko okno postępu bez wymaganych danych wejściowych, a po jego zakończeniu okno dialogowe znika. Rzeczywiste okno dialogowe postępu jest tworzone przez metodę CopyHere. Podobno istnieją opcje, które powinieneś być w stanie przekazać, aby zablokować jakąkolwiek potencjalną interakcję, ale jest tam mnóstwo postów narzekających, że PowerShell ignoruje te konkretne opcje. Miałem nadzieję, że uda mi się uniknąć stron trzecich, jak tylko będzie to możliwe, ale być może będę musiał zapaść w jaskinię. – Trinition

+0

Dostawcy PSCX pakują cmdlety na 7-Zip, ale jeśli chcesz, możesz zawsze użyć 7-Zip bezpośrednio - http://www.7-zip.org/ –

3

Jeśli to nadal aktualne, udało mi się ustalić to z konieczności CopyHere params równy 1564

Więc w moim przypadku ekstraktu zip funkcji wygląda następująco:

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 opis można znaleźć tutaj - http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx :

(4) Nie wyświetlaj okna dialogowego postępu.
(8) Przekaż operację na nową nazwę podczas przenoszenia, kopiowania lub zmiany nazwy, jeśli plik o nazwie docelowej już istnieje.
(16) Odpowiedz na "Tak dla wszystkich" dla dowolnego wyświetlonego okna dialogowego.
(512) Nie potwierdzaj tworzenia nowego katalogu, jeśli operacja wymaga jego utworzenia.
(1024) Nie wyświetlaj interfejsu użytkownika, jeśli wystąpi błąd.

Powiązane problemy