2012-08-10 74 views
0

我有一個清理腳本,我打算通過使用活動目錄來清理數百個虛擬服務器。在過去,我會創建一個能夠顯示以下一個簡單的.txt文件:通過Powershell將信息輸出到電子表格

已存在的腳本運行

前磁盤空間-AMOUNT - 如何它運行

後大的空間 - 總空間被清除

在過去,這個工作很好,但它的目的是一次在單個服務器上使用,而不是數百個。由於我想改變一次在數百個腳本上運行此腳本,因此我想將其更改爲電子表格,該電子表格會顯示相同的數據以及顯示腳本運行的每個服務器的名稱。

我該如何設法以電子表格格式創建這種類型的輸出並顯示它?這是我目前的代碼(.txt方法):

$logFilePath = "C:\logfile.txt" 
$disks = Get-WMIObject -Computer $server -Class Win32_LogicalDisk -Filter "DeviceID like '%C%'" 
$beforeFreeSpace = $disks.FreeSpace 
$beforeFreeSpaceMB = [math]::truncate($beforeFreeSpace/1MB) 

$preCleanupMessage = "Space available before cleanup ran (MB): " 
$preCleanupMessage += $beforeFreeSpaceMB 
$preCleanupMessage | out-file -filePath $logFilePath -Append 

$afterFreeSpace = $disks.FreeSpace 
$afterFreeSpaceMB = [math]::truncate($afterFreeSpace/1MB) 

$freedSpace = "Freed up space after cleanup (MB): " 
$freedSpace += $afterFreeSpaceMB - $beforeFreeSpaceMB 

$freedSpace | out-file -filePath $logFilePath -Append 
$message = "Free space remaining after cleanup (in MB): " 
$message += [math]::truncate($afterFreeSpace/1MB) 
$message | out-file -filePath $logFilePath -Append 

在此先感謝!

回答

1

我會做這樣的事情:

$Servers = "server1","server2" 
$logFileCollection = @() 

$servers | % { 
    Write-Host Working on $_ 
    $server = $_ 
    $disk = Get-WMIObject -Computer $server -Class Win32_LogicalDisk -Filter "DeviceID like '%C%'" 
    $beforeFreeSpaceMB = [math]::truncate($disk.FreeSpace/1MB) 
    #DO SOME WORK HERE TO FREE UP SPACE 
    $logFileCollection += New-Object -Type PSObject -Property @{ 
     beforeFreeSpaceMB = $beforeFreeSpaceMB 
     afterFreeSpaceMB = [math]::truncate($disks.FreeSpace/1MB) 
     freedSpace = [math]::truncate($disks.FreeSpace/1MB) - $beforeFreeSpaceMB 
    } 
} 

$logFileCollection | Export-CSV -NoTypeInformation "C:\logCSV.csv" 

另外,請記住,默認gwmi cmdlet也超時,你可能要解決這一點。祝你好運。另外,手動運行此操作,如果您必須在任何時候中止腳本,只需運行最後一行即可獲得輸出。

+0

嗨克里斯,謝謝你的建議!有一件事關於你所說的關於手動運行的說法,你知道默認gwmi超時的頻率嗎?我打算最終努力使這個腳本自動運行。 – Valrok 2012-08-10 19:58:03

+1

這取決於你的環境。也許你所有的服務器都很健康。我從來沒有。試試這個:http://blog.usepowershell.com/2009/01/dealing-with-wmi-timeouts/ - 另外,你可能想要在這之前拋出一個If(test-connection $ _ -quiet){type check in讓它啓動WMI檢查。 – 2012-08-13 00:28:39

1

我寫了類似1700個虛擬機的東西。我查看了我的所有選項,並立即排除了其中兩個:

  • PowerCLI(VMware PowerShell模塊),因爲我希望我的腳本能夠跨越Hyper-Visors工作。
  • WMI(Get-WMIObject)它太不可靠了。它真的很受歡迎,很想念。

所以我決定用調用命令:

$VMList = "server1","server2" 
$MachineInfo = @() 

foreach($VM in $VMList) 
{ 
    $MachineInfo += Invoke-Command $VM{ 
    $obj = New-Object PSObject 
    $Drive = Get-PSDrive | Where {$_.Name -eq "C"} 
    $beforeFreeSpace = $Drive.Free 
    $beforeFreeSpaceMB = [Math]::Round(($Drive.Free /1024) /1024) 
    $obj | Add-Member -Name "BeforeFreeSpace" -MemberType NoteProperty -Value $beforeFreeSpaceMB 

    ## Clean Up Over Here 

    $Drive = Get-PSDrive | Where {$_.Name -eq "C"} 
    $afterFreeSpace = $Drive.Free 
    $afterFreeSpaceMB = [Math]::Round(($Drive.Free /1024) /1024) 
    $obj | Add-Member -Name "AfterFreeSpace" -MemberType NoteProperty -Value $afterFreeSpaceMB 

    $freedSpace = $obj.AfterFreeSpace - $obj.BeforeFreeSpace 
    $obj | Add-Member -Name "FreedSpace" -MemberType NoteProperty -Value $freedSpace 

    return $obj} 
} 

$MachineInfo | Export-CSV -NoTypeInformation "C:\log.csv" 

了約2個月工作的偉大,現在,也是我修改我貼到只檢查你的C版本:\如果你想開車檢查所有驅動器a只是留下一個評論,並對其進行修改。

+0

你好泰勒,因爲我打算在大量的服務器上運行這個,這正是我想要的,以避免超時。一個問題是,你的代碼是通過每個服務器一個接一個的(因爲使用了一個foreach),還是有一種方法可以一次通過所有的虛擬機?我的代碼大部分運行時間需要20-30分鐘才能運行,如果每週需要運行數百個服務器(計劃自動執行此操作),那麼完成運行需要很長時間。 – Valrok 2012-08-13 15:09:27

+0

嗯,這個腳本是用PowerShell 2編寫的。所以目前你是正確的,它會遍歷每個服務器。這裏真的有兩個選擇,如果你需要使用PowerShell 2,你可以使用-AsJob參數,這個參數將爲每個虛擬機產生一個新的線程,例如,如果你在1000臺服務器上運行它,這可能有點瘋狂。這當前是PowerShell的限制。但是,PowerShell v3引入了Workflows,它允許您並行執行腳本以及檢查點,以防需要重新啓動!我認爲你需要使用PowerShell 2,但如果如此 – 2012-08-13 21:19:17

+0

讓我知道,如果你upvote我生病嘗試修改我的腳本盡我所能可以幫助你:) – 2012-08-13 21:19:52

相關問題