0

Active Directory を使用して何百もの仮想サーバーをクリーンアップするために使用する予定のクリーンアップ スクリプトがあります。以前は、次の内容を表示する単純な .txt ファイルを作成していました。

-スクリプトが実行される前に存在していたディスク容量

- 実行後の空き容量

-合計スペースがクリアされました

以前はこれがうまく機能していましたが、数百台ではなく、一度に 1 台のサーバーで使用することを目的としていました。このスクリプトを数百のスクリプトで一度に実行する方向に変更したいので、これをスプレッドシートに変更して、同じデータを表示し、スクリプトが実行された各サーバーの名前を表示したいと思います。

このタイプの出力をスプレッドシート形式で作成して表示するにはどうすればよいでしょうか? これが私の現在のコードです(.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

前もって感謝します!

4

2 に答える 2

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 コマンドレットがタイムアウトする可能性があるため、回避する必要がある場合があることに注意してください。幸運を。また、これを手動で実行し、任意の時点でスクリプトを中止する必要がある場合は、最後の行を実行してその時点までの出力を取得してください。

于 2012-08-10T19:54:37.453 に答える
1

1700 VM に対して実行されるこのようなものを書きました。私はすべての選択肢を検討し、すぐにそのうちの 2 つを除外しました。

  • PowerCLI (VMware PowerShell モジュール) は、ハイパーバイザー全体でスクリプトを動作させたかったためです。
  • WMI (Get-WMIObject) 信頼性が低すぎます。その本当にヒットとミス。

そこで、invoke-command を使用することにしました。

$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:\ドライブのみをチェックするようにしました。すべてのドライブをチェックしたい場合は、コメントを残して変更してください。

于 2012-08-11T13:04:15.037 に答える