2013-03-26 1 views
5

Ho bisogno di aggiungere una (relativamente) piccola pausa tra due serie di codice perché la seconda metà deve avere la prima metà eseguita correttamente prima dell'esecuzione - ma PowerShell a volte ottiene un po 'più avanti di sé e procede prima del completamento del comando precedente.Powershell: sospensione mid-pipeline

Proprio per il contesto, questo è il codice con cui sto lavorando:

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

Spesso questo viene a mancare perché l'unità non è completamente inizializzato per il momento in PowerShell esegue il New-Partition.

genere userei qualcosa di simile:

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

Tuttavia il problema è che l'oggetto di output di Initialize-Disk si perde e New-Partition non ottiene un oggetto di input.

Ho provato a mettere il Start-Sleep in cantiere:

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

... ma viene generata un'eccezione come Start-Sleep non sa come dare un senso l'oggetto di input (che è abbastanza giusto).

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: Come posso aggiungere una pausa nel mio codice pur mantenendo l'oggetto di output del cmdlet precedente?

risposta

6

Puoi provare a utilizzare processo in background:

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

Per quello che vale, questo non ha funzionato per me. – Bink

2

Potete anche provare (non testata):

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

Se volete dormire il dato numero di secondi per ogni elemento in cantiere si possibile utilizzare ForEach-Object come suggerito Graimer. Se volete dormire solo il dato numero di secondi a prescindere dal numero di elementi in cantiere, è necessario spezzare la pipeline:

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

Questo ha funzionato per me (simile a un'altra risposta):

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