2014-09-26 59 views
0

我對PowerShell非常新,並試圖用各種方法將結果從下面的PowerShell腳本中分離出來,但沒有運氣。目前,腳本列出了每列4列中的所有內容,並且每個服務器的結果之間沒有差距。 (當它完成一個服務器的結果時,我想要在每個結果之間使用服務器名稱來填充空白或頭部,以便在針對多個服務器運行時更​​易於閱讀) 任何幫助獲得此格式的內容都將不勝感激。Powershell格式

Get-WmiObject -ComputerName ("server1","server2") Win32_UserProfile | % { 
    $userinfo = [WMI] ($_.__Path -Replace "Win32_UserProfile", "Win32_SID") 
    New-Object PsObject -Property @{ 
    ComputerName= $_.__Server 
    Domain  = $userinfo.ReferencedDomainName 
    User  = $userinfo.AccountName 
    LastUsed = $_.ConvertToDatetime($_.LastUseTime) 

} 
} | export-csv -NoType c:\Results.csv 

這就是我要做的

server 1 
user lastModified  
bob  8/20/14 
billy 7/20/14  
Carla 6/12/14 

server 2 
user lastModified 
bob  8/20/14 
billy 7/20/14  
Carla 6/12/14 

server 3 
user lastModified 
bob  8/20/14 
billy 7/20/14  
Carla 6/12/14 

這就是我目前得到

lastUsed user computername 
8/20/14 bob server 1 
6/20/14 billy server 1 
9/1/14  sam server 3 
3/2/14  sonny server 4 

所以,當你在50條60曲線扔所有堆積如此,特別是如果你嘗試按日期排序,因爲那時服務器只是全部那個地方。

我每次運行該腳本時都會收到此錯誤,儘管我仍然得到結果並且腳本會生成它應該顯示的內容。

異常調用「ConvertToDateTime」與「1」的參數(一個或多個):「異常呼叫‘ToDateTime’與‘1’的參數(一個或多個):」指定參數超出有效的值的範圍的。 參數名稱:dmtfDate 「」 在行:13字符:33 + $ .ConvertToDatetime < < < <($ .LastUseTime) + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:ScriptMethodRuntimeException

再次感謝您的幫助

+1

如果您向我們展示我們所需的輸出將會容易得多。否則,社區可能會錯誤地認爲你正在尋找並浪費每個人的時間。 – Matt 2014-09-26 02:10:58

+0

當然 - 我需要的是幾個服務器的用戶,上次使用的文件夾和服務器名稱的「用戶」文件夾中的所有文件夾的列表。基本上我需要找出哪些配置文件文件已經過時了一段時間,然後將其放入excel或HTML中。這個腳本正是我所需要的,但沒有格式化。我將在上面展示一個我想要獲得的示例 – MJT 2014-09-26 02:53:27

+0

我想知道如果沒有'LastUsedTime'的值會發生錯誤...如果用戶從未登錄過,那麼它可能爲空。 – Matt 2014-09-26 03:49:20

回答

1
$toFile = "C:\temp\TEST.CSV" 
$header = "Computer","Domain","User","LastUsed" 
$computers = "kanimage02","kanantivirus01" 

ForEach($singleComputer in $computers){ 
    Add-Content -Path $toFile -Value "$singleComputer`n$($header -join ',')" 
    Get-WmiObject -ComputerName ($singleComputer) Win32_UserProfile | ForEach-Object{ 
     $userinfo = [WMI] ($_.__Path -Replace "Win32_UserProfile", "Win32_SID") 
     Add-Content -Path $toFile -Value (@(
      $_.__Server 
      $userinfo.ReferencedDomainName 
      $userinfo.AccountName 
      $_.ConvertToDatetime($_.LastUseTime) 
     ) -Join ",") 

    } 
    Add-Content -Path $toFile -Value "" 
} 

我在試圖讓一個真正的問題Export-Csv嘗試並重復標題。通過將Export-Csv移動到ForEach-Object的管道輸出中,簡單的方法可能是多次調用。然而Export-Csv沒有-StopBeingHelpful開關意味着無論我做了什麼,它都注意到標題已經存在,並且覺得不需要重複它。由於你要求的不是true csv文件輸出我有一個更容易的時間與Add-Content。所以什麼這裏發生了

  1. 我把你的電腦變成一個字符串數組一個小故障稱爲$computers
  2. Get-WmiObject環大多是相同的接受,而不是使一個customPSObject我只是做了簡單數組。這又是爲了阻止PowerShell對它進行特殊處理。在實踐中,創建一個CustomPSObject將其轉換爲數組來導出它似乎毫無意義!
  3. The csv這部分來自-join我拿數組並用逗號連接它們來創建一個csv輸出。在每次循環運行期間,都會放下一個標題,其中包含一行中的計算機名稱和下一行中的標題。WMI數據如下。在循環之間插入空白行以進行隔離,就像在您的示例中一樣。
  4. 您的示例忽略了您正在收集的一些數據。我輸出所有數據,但您可以更改$header和陣列內容以滿足您的需求。

一些樣本輸出應該是這樣的:

kanimage02 
Computer,Domain,User,LastUsed 
KANIMAGE02,NT AUTHORITY,NETWORK SERVICE,9/11/2014 10:25:19 AM 
KANIMAGE02,NT AUTHORITY,LOCAL SERVICE,9/11/2014 10:25:24 AM 
KANIMAGE02,NT AUTHORITY,SYSTEM,2/22/2011 12:07:14 PM 

kanantivirus01 
Computer,Domain,User,LastUsed 
KANANTIVIRUS01,NT AUTHORITY,NETWORK SERVICE,9/10/2014 3:19:03 AM 
KANANTIVIRUS01,NT AUTHORITY,LOCAL SERVICE,9/10/2014 3:19:08 AM 
KANANTIVIRUS01,NT AUTHORITY,SYSTEM,2/22/2011 12:07:14 PM 

需要注意的是,在此期間,沒有一點我清楚的文件。如果它已經包含內容,它將全部追加。

+0

哇 - 這幾乎是我所需要的 - 我應該能夠找出任何其他的變化 - 我注意到,當我運行它,即使我得到結果我得到這個錯誤(這已經是一個問題 - 沒有出現你做的任何事情)這個錯誤你的意思是忽略了一些數據?使用「1」參數調用「ConvertToDateTime」的異常: – MJT 2014-09-26 03:41:15

+0

如果其簡單的東西可能能夠解決它。將其包含在問題中。如果涉及到它可能會更好地成爲另一個問題。 – Matt 2014-09-26 03:43:32

+0

並再次感謝您! – MJT 2014-09-26 03:43:37