5

後半は実行前に前半を正常に実行する必要があるため、2セットのコードの間に(比較的)小さな一時停止を追加する必要がありますが、PowerShellはそれ自体より少し進んで、前のコマンドが完全に完了する前に続行することがあります。

コンテキストのために、これは私が使用しているコードです:

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

PowerShellがを実行するまでにドライブが完全に初期化されていないため、これは失敗することがよくありますNew-Partition

通常、私は次のようなものを使用します。

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

ただし、問題は、の出力オブジェクトInitialize-Diskが失われNew-Partition、入力オブジェクトを取得しないことです。

Start-Sleep私はパイプラインに入れてみました:

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

Start-Sleep...しかし、入力オブジェクトを理解する方法がわからないため、例外がスローされます(これは十分に公平です)。

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:前のコマンドレットの出力オブジェクトを保持したまま、コードに一時停止を追加するにはどうすればよいですか?

4

4 に答える 4

6

バックグラウンドジョブを使用してみることができます:

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false -asjob |
wait-job | receive-job | New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T09:35:08.743 に答える
2

試すこともできます(テストされていません):

Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false |
    % { Start-Sleep -Seconds 2 | Out-Null; $_ } |
    New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T09:48:36.983 に答える
1

パイプライン内の各アイテムに対して指定された秒数をスリープさせたい場合は、Graimerが提案したように使用ForEach-Objectできます。パイプライン内のアイテムの数に関係なく、指定された秒数だけスリープしたい場合は、パイプラインを分割する必要があります。

$disks = Initialize-Disk -PassThru -PartitionStyle GPT -Confirm:$false
sleep 2
$disks | New-Partition -DriveLetter D -UseMaximumSize
于 2013-03-26T10:16:18.127 に答える
0

これは私のために働いた(別の答えと同様):

New-Partition … | ForEach-Object { Start-Sleep -s 3; $_ | Format-Volume … }
于 2016-06-05T01:31:47.270 に答える