1. ホーム
  2. powershell

[解決済み] PowerShellで出力を無視するためのより良い(クリーンな)方法は?[クローズド]

2022-05-10 05:42:45

質問

何かを返すメソッドやコマンドレットがあるけれど、それを使いたくないし、出力もしたくないとします。この2つの方法を見つけました。

Add-Item > $null

[void]Add-Item

Add-Item | Out-Null

あなたは何を使いますか?どちらがより良い/よりクリーンなアプローチですか?なぜですか?

どのように解決するのですか?

私が知っている4つの選択肢について、いくつかテストをしてみたところです。

Measure-Command {$(1..1000) | Out-Null}

TotalMilliseconds : 76.211

Measure-Command {[Void]$(1..1000)}

TotalMilliseconds : 0.217

Measure-Command {$(1..1000) > $null}

TotalMilliseconds : 0.2478

Measure-Command {$null = $(1..1000)}

TotalMilliseconds : 0.2122

## Control, times vary from 0.21 to 0.24
Measure-Command {$(1..1000)}

TotalMilliseconds : 0.2141

というわけで、私がお勧めするのは Out-Null を使うことをお勧めします。 次に重要なのは、私にとっては、可読性でしょう。 私はなんとなく、リダイレクトを $null にリダイレクトして、同じように $null を使うようになりました。 私は以前は [Void] を好むのですが、これはコードをちらっと見るときや新しいユーザーにとっては理解しにくいかもしれません。

へのリダイレクトの方が若干好きかもしれません。 $null .

Do-Something > $null

編集

stejの再度のコメントの後、私は出力をゴミ箱に入れるオーバーヘッドをよりよく分離するために、パイプラインでいくつかのテストを行うことにしました。

ここに、単純な1000オブジェクトのパイプラインを使ったいくつかのテストがあります。

## Control Pipeline
Measure-Command {$(1..1000) | ?{$_ -is [int]}}

TotalMilliseconds : 119.3823

## Out-Null
Measure-Command {$(1..1000) | ?{$_ -is [int]} | Out-Null}

TotalMilliseconds : 190.2193

## Redirect to $null
Measure-Command {$(1..1000) | ?{$_ -is [int]} > $null}

TotalMilliseconds : 119.7923

この場合 Out-Null は約 60% のオーバーヘッドがあり > $null は約0.3%のオーバーヘッドです。

2017-10-16に追記しました。 私はもともと、別の選択肢を見落としていて Out-Null を使用することを見落としていました。 -inputObject パラメータを使用します。 これを使用するとオーバーヘッドがなくなるように見えますが、構文が異なります。

Out-Null -inputObject ($(1..1000) | ?{$_ -is [int]})

そして今度は、シンプルな100個のオブジェクトのパイプラインを使ったテストです。

## Control Pipeline
Measure-Command {$(1..100) | ?{$_ -is [int]}}

TotalMilliseconds : 12.3566

## Out-Null
Measure-Command {$(1..100) | ?{$_ -is [int]} | Out-Null}

TotalMilliseconds : 19.7357

## Redirect to $null
Measure-Command {$(1..1000) | ?{$_ -is [int]} > $null}

TotalMilliseconds : 12.8527

ここでも Out-Null は約60%のオーバーヘッドを持ちます。 一方 > $null は約4%のオーバーヘッドです。 この数字は、テストによって多少異なります(それぞれを5回ほど実行し、中間を選びました)。 しかし、私はこれが Out-Null .