2011-12-15 10 views

Odpowiedz

9

Trzeba będzie rozpocząć proces:

start-process powershell -ArgumentList "sleep 10; cmd /c set > c:\env.txt" -WindowStyle hidden 
1

Można również zrobić to tak

$a = start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 
Register-ObjectEvent -InputObject $a -EventName StateChanged -SourceIdentifier "finished" 
$b = Wait-Event -SourceIdentifier "finished" 
exit 

skrypt będzie czekać na koniec scriptblock aby zakończyć.

+2

Czy to nie to samo, co użycie Wait-job? – manojlds

+0

Prawdopodobnie masz rację, przetestuję! – JPBlanc

+0

Próbowałem powiedzieć, że nie chce tego OP. To, czego chcą, to to, że zadanie nadal działa, gdy rodzic zamyka się (i powinien zamknąć), ale nie powinien czekać na pracę. Ale mogę się mylić w tym :) – manojlds

0

Jeśli stwierdzono, że za pomocą polecenia Inwokacja-Komenda udało się ominąć ograniczenie, że zadanie w tle zamiera z rodzicem. Fajną rzeczą jest to, że składnia jest prawie taka sama jak w przypadku zadania początkowego, więc blok skryptów może być zachowywany tak jak jest.

start-job -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 

po prostu przekształcić

Invoke-Command -ComputerName . -AsJob -scriptblock { sleep 10; cmd /c set > c:\env.txt; } 

i nagle przetrwać śmierci jego rodzic (prawdopodobnie dlatego Invoke-Command jest zdolny do uruchamiania programów na innym komputerze tak rodzic nigdy nie ma znaczenia do niego)

0

Jeśli używasz procesu uruchamiania, tworzysz nowy proces potomny, w którym sesja powershell jest procesem nadrzędnym. Jeśli zabijesz administratora, który rozpoczyna ten proces, nowy proces zostanie osierocony i będzie działał dalej. To będzie jednak nie przetrwać jeśli zabijesz procesu drzewo rodzica

Start-Process -FilePath notepad.exe 

PowerShell nie może rozpocząć nowego niezależnego procesu poza jego drzewie proces dla Ciebie. Można to jednak zrobić w systemie Windows przy użyciu polecenia CreateProcess, a ta funkcja jest udostępniana za pośrednictwem usługi WMI. Na szczęście, można nazwać z PowerShell:

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList notepad.exe 

ten sposób nowy proces będzie również biec jeśli drzewo proces zostanie zabity, ponieważ nowy proces nie ma sesji PowerShell jako rodzic, ale proces hosta WMI.

Powiązane problemy