PowerShellスクリプトでログファイルに出力を書き込む方法【初心者向け解説】
シンプルなテキストログファイルを活用することで、PowerShellスクリプトの実行状況を管理し、すべての処理内容を追跡できます。これはエラーのデバッグやスクリプトの動作監査を行う際に非常に役立ちます。本記事では、PowerShellスクリプトの出力をテキストログファイルに書き込むことで、ロギングを実現するいくつかの方法をご紹介します。
基本的なログファイルへの出力方法
最もシンプルなケースとして、情報メッセージやPowerShellコマンドの実行結果をテキストログファイルに書き込みたい場合は、以下のいずれかの形式を使ってPowerShellの出力をテキストファイルにリダイレクトできます。
Write-Output "Files are successfully created in $env:computername" >> C:\PS\Logs\TestLog.txt
Add-Content -Path C:\PS\Logs\TestLog.txt -Value "Files are successfully created in $env:computername"
"Files are successfully created in $env:computername" | Out-File -FilePath C:\PS\Logs\TestLog.txt –Append
いずれの方法でも、指定したテキストが新しい行としてtxtファイルに追記されます。
一方、ログファイルの内容を毎回上書きしたい場合は、Set-Contentコマンドレットを使用してください。

タイムスタンプを付けてログを記録する
この方法の主な欠点は、ログにエントリ(イベント)がいつ書き込まれたのかを把握できないことです。そこで、現在のタイムスタンプをログファイルに追加しましょう。これにより、スクリプトが実行された時刻や特定のイベントが発生した時刻を特定できるようになります。
さらに便利にするには、PowerShellスクリプト内に独立した関数を作成し、受け取ったデータをログファイルに書き込むと同時に、各イベントにタイムスタンプを付加するようにします。
関数は以下のように作成できます。
$Logfile = "C:\PS\Logs\proc_$env:computername.log"
function WriteLog
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString"
Add-content $LogFile -value $LogMessage
}
あとは、何かをログに記録したい場面でWriteLog関数を呼び出すだけです。
WriteLog "The script is run"
WriteLog "Calculating…."
Start-Sleep 20
WriteLog "The script is successfully executed"
これで、ログファイルの各エントリの記録時刻を確認できるようになります。

なお、スクリプト内のWrite-Hostの呼び出しをLogWriteに置き換えても同様に機能します。
Start-Transcriptを使ったセッション全体の記録
PowerShellには、PSコンソールに表示されたすべてのコマンドと出力をテキストログファイルに保存できる、トランスクリプト(文字起こし)機能が組み込まれています。
現在のPowerShellセッションをログに記録するには、Start-Transcriptコマンドレットを使用します。
コマンドを実行すると、すべてのコマンドの出力が記録されるファイルを示すメッセージが表示されます。デフォルトでは、ログファイルは現在のユーザープロファイル内に保存されます。
Transcript started, output file is C:\Users\user\Documents\PowerShell_transcript.DESKTOP-P2FHTKQ.+IzDgZiN.20210908163729.txt
テキストファイルの保存先パスは、次のように指定できます。
Start-Transcript -Append C:\PS\Logs\PSScriptLog.txt
–Appendオプションを付けると、新しいセッションのログがファイルの末尾に追記されます(上書きされません)。
次に、結果をコンソールに出力するPowerShellコマンドをいくつか実行してみましょう。例として、実行中のプロセス一覧、サービス一覧、ADレプリケーションの状態を表示します。
Get-Process| where-object {$_.WorkingSet -GT 500000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" –Descending
Get-Service | Where-Object {$_.status -eq 'Running'}
Get-ADReplicationFailure -Target mun-dc01
現在のPowerShellセッションの記録を停止するには、以下を実行します。
Stop-Transcript
その後、トランスクリプトのログファイルを開いてみてください。

ご覧のとおり、ログにはコンソールで実行されたPowerShellコマンドの全履歴と、すべての出力が記録されています。
エラーや警告もすべてログに記録されるため、複雑なPowerShellスクリプトをデバッグする際に非常に便利です。
このように、Start-TranscriptとStop-TranscriptコマンドレットをPowerShellスクリプトに組み込めば、すべての操作と出力をネイティブにログ記録できます。
グループポリシーでPowerShellの記録を自動化する
グループポリシーの「PowerShellの文字起こしを有効にする」(Turn on PowerShell Transcription)オプション(コンピューターの構成 → 管理用テンプレート → Windowsコンポーネント → Windows PowerShell)を使用すると、コンピューター上で実行されるすべてのPowerShellコマンドとその出力を自動的にログ記録できます。コンピューターにGPO設定が反映されると、実行中のpowershell.exeプロセスごとに個別のテキストログファイルが作成され、すべてのPSコマンドとその出力が記録されるようになります。

-
PowerShellでフォルダとサブフォルダを高速に削除する方法【コマンドプロンプト・右クリックメニュー対応】
Windows 10でファイルを削除するのは非常に簡単ですが、エクスプローラーでの削除にかかる時間はアイテムによって大きく異なります。影響する要素としては、ファイルサイズ、個別ファイルの数、ファイル形式などが挙げられます。そのため、数千ものファイルを含む大容量フォルダの削除には数時間かかることもあります。場合によっては、削除中に表示される推定残り時間が1日以上になることさえあります。 さらに、従来の削除方法ではごみ箱を空にする必要があり、完全にPCからファイルを消去するには手間がかかります。そこで本記事では、Windows PowerShellを使ってフォルダやサブフォルダを高速に削除する方法
-
PowerShellでファイルとフォルダーを削除する方法【Remove-Itemコマンド徹底解説】
ファイルやフォルダーをひとつずつ手動で削除するのは、意外と手間がかかる作業です。しかし、PowerShellの使い方をマスターしていれば、そんな面倒な作業も一瞬で終わらせられます。この記事では、PowerShellを使ってWindowsのファイルやフォルダーを削除するさまざまな方法を紹介します。 PowerShellとは PowerShellは、Windowsが無料で提供しているコマンドライン自動化ツールです。コマンドプロンプトのウィンドウ上で起動するシェルを通じて、OSをより細かくコントロールできるようになるのが特徴です。 PowerShellでは「コマンドレット(Cmdlet)」と呼ばれ