2012-01-25 9 views
3

同僚と私は、同社のネットワーク上にあるすべてのコンピュータの名前を含むCSVファイルを使用し、リモートレジストリに接続するためにこれらの名前を使用するpowershellスクリプトを作成しようとしています。特定の値を抽出する。powershellを使用して複数のコンピュータからレジストリ値を抽出する

これは、我々がこれまで持っているものです。

$strMachineName = import-csv .\computer_name.csv 
foreach ($line in $strMachineName) 
{ 
       $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $line.computer) 
       $regkey = $reg.OpenSubkey("SOFTWARE\\Olympus\\DSSPlayerPro\\Transcription Module\\UserInformation") 
       $serialkey = $regkey.GetValue("SerialNumber") 
       write-host $line","$serialkey 
} 

、このスクリプトが正常に動作しますが、それは難しい多くのコンピュータに理解するために作る出力の問題があります。

stdoutをcsvまたはtxtのいずれかの別のファイルに出力できます。また、stderrをnullに出力したい場合や、後で検査できるように別のファイルを出力したい場合もあります。

write-hostは、変数が使用されているときにファイルに出力できないため、適切なコマンドではないと考えられているため、エコーを使用しようとしましたが、変数の取得に問題があります私が望むように働くこと。

ありがとうございました。

答えて

4

try/catchで例外を捕捉する必要があります。

$strMachineName = import-csv .\computer_name.csv 
foreach ($line in $strMachineName) 
{ 
    try { 
     $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $line.computer) 
     $regkey = $reg.OpenSubkey("SOFTWARE\\Olympus\\DSSPlayerPro\\Transcription Module\\UserInformation") 
     $serialkey = $regkey.GetValue("SerialNumber") 

     ('"{0}","{1}"' -f $line.computer, $serialkey) | out-file C:\stdout.csv -append -encoding ascii 
    } catch { 
     ('"{0}","{1}"' -f $line.computer, $_) | out-file C:\stderr.csv -append -encoding ascii 
    } 
} 

これは、2つのファイル(stdout.csvとstderr.csv)を作成します。成功したクエリはstdout.csvに格納され、失敗したクエリはstderr.csvに格納されます。

+1

ありがとう、私は明日それを試してみます。 **( '"{0}"、 "{1}"' -f ...)**の部分をもっと説明できますか?私は、最初の変数をゼロの代わりに置き、2番目の変数を1の代わりに置き、コンマをその間に置くと推測しています。このテクニックは何と呼んでいますか?私はそれについて私自身の読書をしたいと思います。 – smierdziel

+0

@smierdzielあなたにスポットがあります。それは文字列フォーマットと呼ばれます。ここには良い[ブログ記事](http://devcentral.f5.com/weblogs/Joe/archive/2008/12/19/powershell-abcs---f-is-for-format-operator.aspx)があります。 –

+0

@smierdziel注 - catchブロックの '$ _'は例外のオブジェクトになります。パイプを 'Get-Member'にパイプするか、PowerGUIでデバッグすれば、面白いものがすべて見つかります。 –

関連する問題