[解決済み] PowerShell Set-ContentとOut-File - 違いは何ですか?
質問
PowerShellでは、以下の違いは何ですか?
Out-File
と
Set-Content
? または
Add-Content
そして
Out-File -append
?
同じファイルに対して両方を使用すると、テキストが完全に モジベーク .
(細かい第二の質問ですが
>
のエイリアスです。
Out-File
のことですね?)
どのように解決するのですか?
PowerShell を数ヶ月間使用し、いくつかの科学的な実験を行った結果、私が推測したことをまとめます。私はドキュメントでこのどれかを見つけることはありませんでした :(
[ 更新しました。 この多くは、現在、より良い文書化されているようです]。
読み取りと書き込みのロック
一方
Out-File
が実行されている間、他のアプリケーションはログファイルを読むことができます。
一方
Set-Content
が実行されている間は、他のアプリケーションはログファイルを読むことができません。そのため
を使うことはありません。
Set-Content
を使って、長く実行されるコマンドのログを取らないようにしてください。
エンコーディング
Out-File
に保存されます。
Unicode
(
UTF-16LE
) のエンコーディングがデフォルトで指定されています (指定することも可能です)、一方
Set-Content
はデフォルトで
ASCII
(
US-ASCII
) を PowerShell 3+ で指定することができます (これも指定可能です)。それ以前のバージョンのPowerShellでは
Set-Content
にコンテンツを書き込んでいました。
Default
(ANSI)エンコーディングで書かれています。
編集者注
: バージョン5.1時点でのPowerShell
はまだ
はデフォルトで文化固有の
Default
("ANSI") エンコーディングになります。もしASCIIがデフォルトであれば、非ASCII文字である
ü
のような非ASCII文字は次のように変換されます。
リテラル
?
というように、しかしそれは
ではない
である。
'ü' | 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
はパイプラインからデータを取得し、1つのファイルの内容を更新します。
パラメータ
Set-Content
には、以下の追加パラメータがあります。
- 除外する
- フィルタリング
- 含む
- パススルー
- ストリーム
- UseTransaction
Out-File
には、以下の追加パラメータがあります。
- 追加
- ノークロッバー
- 幅
これらのパラメータが何であるかについての詳細は、ヘルプを参照してください; 例えば
get-help out-file -parameter append
.
関連
-
[解決済み] Powershell - 空のパイプ要素は許可されません。
-
[解決済み] ヌル値の式でメソッドを呼び出すことはできない
-
[解決済み] 'Connect-MsolService' はコマンドレット名として認識されません。
-
[解決済み] PowerShellの画面を各コマンドの前に自動的にクリアする方法はありますか?
-
[解決済み] PowerShellでコードをコメントアウトする方法とは?
-
[解決済み] PowerShellで文字列と変数を連結する方法は?
-
[解決済み] 現在のPowerShellスクリプトの場所を特定する最良の方法は何ですか?
-
[解決済み] PowerShell 2.0を使ってディレクトリ全体を再帰的に削除するには?
-
[解決済み】PowerShellスクリプトを実行する方法
-
[解決済み】Array.Add vs +=.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Invoke-Command エラー "Parameter set cannot be resolved using specified named parameters".
-
[解決済み] Get-ChildItem -force で My Documents フォルダとその他の接続ポイントに "Access Denied" を報告する。
-
[解決済み] PowerShellにおけるセット(データ構造)
-
[解決済み] "get-wmiobject win32_process -computername" でエラー "Access denied , code 0x80070005" が発生する。
-
[解決済み] powershell で $args 配列にアクセスする
-
[解決済み] PowerShellでLDAPクエリ
-
[解決済み] Powershell New-ScheduledTaskTrigger -RepetitionIntervalを使った反復タスクの実行
-
[解決済み] Powershell:スクリプトにエラーが表示されないようにするにはどうすればよいですか?
-
[解決済み] 配列、ハッシュテーブル、ディクショナリーを作成しますか?
-
[解決済み] PowerShellでディレクトリを変更する