2012-01-25 49 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 
    } 
} 

這會創建兩個文件(stdout.csv和stderr.csv)。成功的查詢存儲在stdout.csv中,失敗的查詢存儲在stderr.csv中。

+1

謝謝,我會嘗試明天。你能解釋**('「{0}」,「{1}」'-f ...)**部分嗎?我猜測它將第一個變量替換爲零,第二個替換爲第二個變量,並在兩者之間插入一個逗號。你稱這種技術是什麼?我想做一下自己的閱讀。 – 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進行調試,你會發現裏面有各種有趣的東西。 –