実行中にPowerShellの出力をファイルにリダイレクトする方法


198

出力をファイルにリダイレクトするPowerShellスクリプトがあります。問題は、このスクリプトの呼び出し方法を変更できないことです。だから私はできません:

 .\MyScript.ps1 > output.txt

PowerShellスクリプトの出力を実行中にリダイレクトするにはどうすればよいですか?

回答:


192

多分Start-Transcriptあなたのために働くでしょう。すでに実行されている場合は、最初に停止してから開始し、完了したら停止します。

$ ErrorActionPreference = "SilentlyContinue"
ストップトランスクリプト| アウトヌル
$ ErrorActionPreference = "続行"
Start-Transcript -path C:\ output.txt -append
#何かをする
ストップトランスクリプト

作業中にこれを実行して、後で参照できるようにコマンドラインセッションを保存することもできます。

文字起こししていない筆記録を停止しようとしたときにエラーを完全に抑制したい場合は、次のようにします。

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
start-transcriptはWrite-Error、Write-Verbose、またはWrite-Debug ...の標準出力のみを記録しないことに注意してください。
Richard Berg、

6
@richard:今はそうしているようです。多分これは2.0の追加ですが、これらの答えがすべて1.0に当てはまるかどうかはわかりません。
Robert S Ciaccio 2010

上記とほぼ同じコードを使用しています。私の問題は、文字起こしが開始されない場合、Stop-Transcript | out-nullがエラー出力を送信することです。メッセージがレイアウトを混乱させるので、メッセージを抑制する必要があります。-erroraction silentlycontinueも役に立ちません。何か案は?
Mel

4
ついに、Start-Transcriptのドキュメントを見つけました。(イライラしてPowershellのバージョン番号でラベル付けされていません)。「トランスクリプトには、ユーザーが入力したすべてのコマンドと、コンソールに表示されるすべての出力が含まれています」と書かれています。ただし、Powershell 2.0でStart-Transcriptをテストしたところ、@ Richardが正しいことがわかりました。標準エラートランスクリプトに保存されません。これは最悪だ!
大佐パニック

指定した場所への書き込み権限を実際に持っている場合、このメソッドは警告を表示しないようです。
デーモンゴレム2016

51

Microsoftは、PowershellのConnections Webサイト(2012-02-15 at 4:40 PM)で、バージョン3.0でこの問題の解決策としてリダイレクトを拡張したことを発表しました。

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

詳細と例については、「about_Redirection」ヘルプ記事をご覧ください。

help about_Redirection

1
私はこのソリューションが好きだと言っているわけではありません。実際、醜く、覚えにくく、柔軟性に欠けると思います。ストリームキャプチャパラメータをOut-*、Set-Content、Add-Contentコマンドレットに追加することで、Powershellyの方法でトリックを実行できたようです。彼らはそれを行っている間、-PassThruパラメータも追加する必要があります。これにより、有用ではないTee-Objectコマンドレットが実質的に廃止されます。
Nathan Hartley

私は混乱しています、これは質問されている質問にどのように答えますか?「PowerShellスクリプトの実行中に出力をリダイレクトするにはどうすればよいですか?」
Zoredache

その通りです、@ Zoredache、私は「このスクリプトの呼び出し方法を変更できない」という要件を見落としているようです。出力の大部分をキャプチャする場合は、Start-Transcriptが適しています。この回答を削除する必要がありますか?
Nathan Hartley

1
一般的なリダイレクトのためにここに来る人のために、Powershellは-OutVariable -WarningVariable -ErrorVariableを追加しました。これは、2014年1月3日のコメントに直接回答します。
Nathan Hartley

2
いいえ、そのままにしておいてもかまいません。賛成票の数を考えると、それは明らかに有用です。この質問は、ほぼ間違いなく、スクリプトの呼び出し方法を変更できる人々からGoogleのヒットを得ていることです。
Zoredache

36

使用する:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
OPの問題は「実行中」には機能しないため、OPの問題は解決しません。しかし、Powershellでパイプする方法を知っていると便利なので、+ 1しました。
Paul Masri-Stone

28

変更できると思いますMyScript.ps1。次に、次のように変更してみます。

$(
    Here is your current script
) *>&1 > output.txt

私はこれをPowerShell 3で試しました。NathanHartley の回答のように、すべてのリダイレクトオプションを使用できます。


私はこのソリューションが好きです。追加するには>> output.txtを使用できます。これでUnicodeの代わりにASCIIを作成する方法があるかどうか誰でも知っていますか?
Von Lemongargle教授、

1
あなたはこのようなことを試すかもしれません:*>&1 | Out-File $log -Encoding ascii -Append -Width 132しかし、あなたが出力を正確に制御する必要があるならば、Powershellは本当に醜いです。
mplwork 2016年

スクリプト内で機能するため、私はこれを好みます。浮浪者に最適です。
user3505901

25

あなたの状況がそれを可能にするならば、1つの可能な解決策:

  1. MyScript.ps1の名前をTheRealMyScript.ps1に変更します。
  2. 次のような新しいMyScript.ps1を作成します。

    。\ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
これは、スクリプト出力で機能する多くのオプションの中で唯一のものでした。
cori 2017年

17

コマンドレットTee-Objectを確認することをお勧めします。出力をTeeにパイプすると、パイプラインとファイルに書き込まれます


1
「出力」| Set-Content -PassThruおよび "output" | Add-Content -PassThruもTee-Objectのように機能し、エンコーディングを設定できるという利点があります。
Nathan Hartley

16

すべての出力をファイルに直接リダイレクトする場合は、次を使用してみてください*>>

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

これはファイルへの直接リダイレクトであるため、コンソールに出力されません(多くの場合役立ちます)。コンソール出力が必要な場合は、すべての出力をと組み合わせて*&>1から、次のようにパイプしTee-Objectます。

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

これらの手法はPowerShell 3.0以降でサポートされていると思います。PowerShell 5.0でテストしています。


4

コマンドラインから実行したいがスクリプト自体に組み込まない場合は、次のコマンドを使用します。

.\myscript.ps1 | Out-File c:\output.csv

7
質問者は、スクリプト呼び出しは変更できないことを明示的に説明しています。
2014年

2
質問とは関係ありませんが、私にとっては役に立ちました。Pipeto Out-Fileで正しい構文を取得するためにグーグルで作業していました。
gReX 2017

0

これをスクリプトに埋め込むには、次のようにします。

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

これでうまくいくはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.