2016-06-25 15 views
1

テキストファイルの内容を取得して配列を作成し、リストを反復してリスト内の各サーバーでnslookupを実行するpowershellスクリプトを作成しました。 txtファイル。私は、出力ストリームとtxtファイルにデータを取得する以外はすべてを行うことができます。Powershell Loopがデータストリームにスタックしました

私は、コードの一部とともにだけでなく、これまでに行ったこと:)

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt' 

私は内の各項目を反復処理しようとする各ループのためにを通してそれを渡すあなたを与えるだろうそれをnslookupに渡して、リスト内の各サーバのDNSクエリを実行します。

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt' 

foreach($server in $serverlist) 
{ 
    nslookup $server 
} 

これは本当に本当にpowershellクライアントでうまくいきます。問題は、完全にループを使ってテキストファイルに出力した後、コンソールから出力を得ることができないということです。

私はこのスクリプトを扱っている理由である膨大な検索を扱っています。

私はout-fileを試みたと私は無駄でscript > domainlist.txtを試してみました、write-hostを試してみました。

データストリームに滞留していて、どこに行くのかわからないと思われます。

私も次のようなものを試してみました:

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt' 
$domainlist = Out-file -path 'c:\users\username\desktop\domainlist.txt' 
foreach($server in $serverlist) 
{ 
    nslookup $server 
} 

script > $domainlist. 

私は多くのことができますisesteroidsのループでそれを破壊しようとしましたが、それはデータ・ストリームで起こってすることができるものを私に教えてくれありません。ループ本体内のファイルへの直接

答えて

0

PowerShellは紛らわしい二つの異なるforeach構造を持っています。上で使用しているforeach ($var in $collection)ステートメントがあり、Foreach-Objectコマンドレットがあります。

# Statement foreach 
foreach($server in $serverlist) { 
    nslookup $server 
} 

# Same loop using cmdlet foreach. 
# The current item is stored in the special variable $_ 
$serverlist | Foreach-Object { 
    nslookup $_ 
} 

出力をリダイレクトできないのは、ステートメントforeachがPowerShellパイプラインに出力されないためです。 これを回避する1つの方法は、foreachコマンドレットに切り替えることです。

これを回避する別の方法は、>>追加リダイレクション演算子を使用して、ループ全体をリダイレクトするのではなく、nslookupの出力を直接リダイレクトすることです。

del domainlist.txt 
foreach($server in $serverlist) { 
    nslookup $server >> domainlist.txt 
} 

これはdomainlist.txtファイルの末尾にnslookup.exeからの出力にそれが実行されるたびに追加されます。

ワンノートon nslookupnslookupコマンドは、stdoutではなく、stderrストリームにエラーを送信します。これらのエラーをキャプチャするには、サイドノートとして2>&1

nslookup $server 2>&1 >>domainlist.txt 

を使用して、出力にエラーストリームをリダイレクトする必要があります:PowerShellは改行上の暗黙の声明ブレークとスクリプト言語なので、あなたは本当にで取得する必要があります次の行ではなく、行頭に中括弧を置く習慣。最初の行が何らかの形で完全な文である場合、次の行のスクリプトブロックにバインドしないため、デバッグの問題が非常に難しくなります。

0

出力:

foreach($server in $serverlist) 
{ 
    nslookup $server |Out-File C:\output.txt -Append 
} 
+0

アウトプットファイルに渡される前に出力全体がメモリに格納されなければならないので、ループ全体を変数に割り当てるのはお勧めしません。パイプラインへの出力またはループ本体内への出力が好ましい。 –

+0

@RyanBemrose絶対に –

+0

私はOut-Fileにパイプされたfor-eachオブジェクトを実際に使用しました。ここに私が実装した最終コードがありました。 'コード' $ serverlist | ForEach-Object {nslookup $ _} |フィードバックOut-File $ domainlistです。私は "コード"編集スキルがまだWebフォームに入力するためにそこにない場合、申し訳ありませんオーバーフローする新しいユーザーです。私はよくある質問を探しています:) – banman

関連する問題