Назад | Перейти на главную страницу

Использование powershell для сбора диска, используемого в таблице sql

У меня есть сценарий, который подключается к базе данных, чтобы получить список серверов для запроса, а затем запрашивает у них дисковое пространство с помощью запроса wmi. Теперь я хотел бы вывести эти результаты в таблицу. Я столкнулся с несколькими проблемами.

invoke-sqlcmd - проблема в использовании с хранимой процедурой или параметрами - не удалось заставить ее работать. Хеш-таблицы находятся в списке, которые будут реализованы в следующей версии. Я планирую сделать это много раз для системы мониторинга, и метод sql выглядит очень неуклюжим.

Я также мог бы экспортировать в CSV и периодически импортировать импорт, но из-за того, как работает структура кода, у меня возникают проблемы с записью в один-единственный CSV - не знаю, как настроить структуру данных для хранения хеш-таблицы, содержащей мои $ приводит к результату.

Есть идеи о том, как сделать эту работу и сделать несколько легко / просто?

$servers = Invoke-Sqlcmd -Query "SELECT SERVERHardwareName FROM SERVERLIST_Hardware WHERE EXCLUDE = 0 and activenode = 1 or activenode is null;" -ServerInstance "sqlserver" -Database "dba_rep"

$ExportPath = 'c:\temp\psout\Server-DiskSpace.csv'

# going through, server by server, querying.
foreach($server in $servers)
{

    $server =  $server.SERVERHardwareName + '.fullyqualified.domain'
    Write-Output $server

    $Drives = Get-WmiObject -ComputerName $server -Query 'SELECT * from Win32_LogicalDisk WHERE DriveType=3' `
    | select SystemName,DeviceId,DriveType, VolumeName,Description,
    @{Label="FreeSpace(GB)"; `
    Expression={"{0:N2}" `
    -f ($_.FreeSpace/1GB)}},`
    @{Label="Size(GB)"; `
    Expression={"{0:N2}" `
    -f ($_.Size/1GB)}} 

    # So here we have a hash table of drives for one server
    foreach($Drive in $Drives)
    {
        $Drive | Export-Csv -Path $ExportPath -NoTypeInformation

    }


}
$servers = Invoke-Sqlcmd -Query "SELECT SERVERHardwareName FROM SERVERLIST_Hardware WHERE EXCLUDE = 0 and activenode = 1 or activenode is null;" -ServerInstance "sqlserver" -Database "dba_rep" | foreach {$_.SERVERHardwareName}
$ExportPath = 'c:\temp\psout\Server-DiskSpace.csv'  
Get-WmiObject -ComputerName $servers -Query 'SELECT * from Win32_LogicalDisk WHERE DriveType=3' ` 
| select SystemName,DeviceId,DriveType, VolumeName,Description, @{Label="FreeSpace(GB)";Expression={"{0:N2}" -f ($_.FreeSpace/1GB)}},`
  @{Label="Size(GB)";Expression={"{0:N2}" -f ($_.Size/1GB)}} | Export-Csv -NoTypeInformation -Path $exportpath

Вы можете немного упростить, загрузив свои списки серверов в массив и передав массив в get-wmiobject. Если вы посмотрите на get-help get-wmiobject, вы заметите, что параметр computername равен string [], всякий раз, когда вы видите string [], это означает, что он принимает массив.

Вы также можете создать объект SMO для первоначального запроса серверов, а затем повторно использовать соединение с сервером SMO для выполнения вставки (информации о диске) обратно на тот же сервер.