2013-03-26 13 views
5

Potrzebuję dodać (stosunkowo) małą pauzę między dwoma zestawami kodu, ponieważ druga połowa musi mieć pierwszą połowę pomyślnie wykonaną przed uruchomieniem - ale PowerShell czasami trochę wyprzedza siebie i postępuje, zanim poprzednie polecenie zakończy się całkowicie.Powershell: Sleeping mid-pipeline

Tylko dla kontekstu, jest to kod pracuję z:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false ` 
     | New-Partition -DriveLetter D -UseMaximumSize 

Często to się nie powiedzie, ponieważ napęd nie jest całkowicie zainicjowany przez czas PowerShell wykonuje New-Partition.

Zwykle bym użyć coś takiego:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false 
Start-Sleep -Seconds 2 
New-Partition -DriveLetter D -UseMaximumSize 

Jednak problemem jest to, że obiekt wyjściowy Initialize-Disk jest stracone i New-Partition nie uzyskać obiekt wejściowy.

Próbowałem oddanie Start-Sleep w rurociągu:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false ` 
     | Start-Sleep -Seconds 2 ` 
     | New-Partition -DriveLetter D -UseMaximumSize 

... ale zgłasza wyjątek jako Start-Sleep nie wie, jak ma sensu obiektu wejściowego (co jest fair enough).

Start-Sleep : The input object cannot be bound to any parameters for the command either because the command does not take pipeline 
input or the input and its properties do not match any of the parameters that take pipeline input. 
At C:\Users\Administrator\Desktop\test.ps1:104 char:87 
+ ... nfirm:$false | Start-Sleep -Seconds 2 ` 
+     ~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (MSFT_Disk (Obje...11E2-93F2-0...):PSObject) [Start-Sleep], ParameterBindingException 
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.StartSleepCommand 

tl; dr: W jaki sposób mogę dodać pauzę w moim kodu utrzymując obiekt wyjściowy poprzedniego apletu polecenia?

Odpowiedz

6

Można spróbować użyć tła pracy:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false -asjob | 
wait-job | receive-job | New-Partition -DriveLetter D -UseMaximumSize 
+0

To, co jest warte, nie zadziałało. – Bink

2

Możesz także spróbować (niesprawdzone):

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false | 
    % { Start-Sleep -Seconds 2 | Out-Null; $_ } | 
    New-Partition -DriveLetter D -UseMaximumSize 
1

Jeśli chcesz spać daną liczbę sekund dla każdej pozycji w rurociągu ty można użyć ForEach-Object jako sugerowanego Graimer. Jeśli chcesz spać tylko określoną liczbę sekund, niezależnie od liczby elementów w rurociągu, trzeba zerwać rurociągu:

$disks = Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false 
sleep 2 
$disks | New-Partition -DriveLetter D -UseMaximumSize 
0

ten pracował dla mnie (podobny do innego odpowiedź):

New-Partition … | ForEach-Object { Start-Sleep -s 3; $_ | Format-Volume … }