96

Out-FilePowerShell では、との違いは何Set-Contentですか? それとも?Add-Content_Out-File -append

同じファイルに対して両方を使用すると、テキストが完全にmojibakedになることがわかりました。

(マイナーな 2 番目の質問:>は のエイリアスOut-Fileですよね?)

4

6 に答える 6

103

これは、PowerShellの数か月の経験といくつかの科学的実験の後で、私が推測したことの要約です。私はドキュメントでこれを見つけたことがありません:(

[更新:これの多くは、より適切に文書化されているように見えます。]

読み取りおよび書き込みロック

の実行中Out-Fileに、別のアプリケーションがログファイルを読み取ることができます。

実行中Set-Content、他のアプリケーションはログファイルを読み取ることができません。したがって、長時間実行されるコマンドをログに記録するために使用しないでください。Set-Content

エンコーディング

Out-FileUnicodeデフォルトでは(UTF-16LE)エンコーディングで保存されますが(これは指定できます)、PowerShell 3+ではSet-ContentデフォルトでASCIIUS-ASCII)になります(これも指定できます)。以前のPowerShellバージョンでSet-Contentは、コンテンツをDefault(ANSI)エンコーディングで記​​述していました。

編集者のメモ:バージョン5.1以降のPowerShellは、ドキュメントに記載されている内容にかかわらず、デフォルトでカルチャ固有Default( "ANSI")のエンコーディングになっています。ASCIIがデフォルトの場合、のような非ASCII文字はリテラルüに変換されますが、そうではありません:yields 。 ?'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'$False

PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt

これは、2つのコマンドのデフォルトに互換性がなく、それらを混在させるとテキストが破損することを意味するため、常にエンコーディングを指定してください。

フォーマット

Bartekが説明したようOut-Fileに、ターミナルで見られるように、出力の派手なフォーマットを保存します。したがって、2つのファイルがあるフォルダーでは、コマンドdir | out-file out.txtは11行のファイルを作成します。

一方Set-Content、より単純な表現を保存します。2つのファイルがあるそのフォルダーに、コマンドdir | set-content sc.txtは2行のファイルを作成します。ターミナルで出力をエミュレートするには:

PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt

このフォーマットは改行に影響すると思いますが、まだ説明できません。

ファイルの作成

Set-Content次の場合、空のファイルを確実に作成しませんOut-File

空のフォルダでは、コマンドdir | out-file out.txtはファイルを作成しますが、作成しdir | set-content sc.txtません。

パイプライン変数

Set-Contentパイプラインからファイル名を取得します。いくつかのファイルの内容を固定値に設定できます。

Out-Fileパイプラインからデータを取得します。単一のファイルのコンテンツを更新します。

パラメーター

Set-Content次の追加パラメータが含まれます。

  • 除外する
  • フィルター
  • 含む
  • パススルー
  • ストリーム
  • UseTransaction

Out-File次の追加パラメータが含まれます。

  • 追加する
  • NoClobber

これらのパラメーターの詳細については、ヘルプを参照してください。例:get-help out-file -parameter append

于 2012-11-24T18:10:54.630 に答える
19

Out-File-NoClobberand/or-Appendフラグが設定されていない限り、出力パスを上書きする動作があります。Add-Content出力パスがデフォルトですでに存在する場合(可能な場合)、コンテンツを追加します。ファイルが存在しない場合は、どちらもファイルを作成します。

もう 1 つの興味深い違いは、Add-Contentデフォルトで ASCII エンコード ファイルOut-Fileが作成され、デフォルトでリトルエンディアン Unicode エンコード ファイルが作成されることです。

>エイリアス構文シュガーですOut-File。いくつかのOut-File事前定義されたパラメーター設定があります。

于 2012-05-18T16:04:02.023 に答える
10

まあ、私は同意しません... :)

  1. Out-FileにはAdd-Contentを追加する-Append(-NoCloberは上書きを避けるためにあります)があります。しかし、これは同じ獣ではありません。
  2. コマンド| Add-Contentは、入力時に.ToString()メソッドを使用します。Out-Fileはデフォルトのフォーマットを使用します。

それで:

ls | Add-Content test.txt

ls | Out-File test.txt

まったく異なる結果が得られます。

いいえ、「>」はエイリアスではなく、リダイレクト演算子です(他のシェルと同じです)。そして、非常に深刻な制限があります...それはそれらが表示されるのと同じ方法で線をカットします。Out-Fileには、これを回避するのに役立つ-Widthパラメーターがあります。また、リダイレクト演算子を使用すると、使用するエンコーディングを決定できません。

HTH Bartek

于 2012-05-18T18:43:48.650 に答える