使用 powershell 将磁盘使用情况收集到 sql 表中

使用 powershell 将磁盘使用情况收集到 sql 表中

我有一个脚本,它连接到数据库以获取要查询的服务器列表,然后使用 wmi 查询查询它们的磁盘空间。现在我想将这些结果放入表中。我遇到了一些问题。

使用存储过程或参数时,invoke-sqlcmd 非常麻烦 - 无法让它工作。哈希表在下一版本中将被实现。我计划为监控系统多次执行此操作,但 sql 方法看起来非常笨拙。

我还可以导出到 csv 并定期导入,但代码结构的运作方式使我无法写入单个 csv - 不确定如何设置数据结构来保存保存我的 $drives 结果的哈希表。

关于如何使其工作并使其变得轻松/简单,您有什么想法吗?

$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

    }


}

答案1

$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[],就意味着它采用数组。

答案2

您还可以为初始服务器查询创建一个 SMO 对象,然后重新使用 SMO 服务器连接将(磁盘信息)插入到同一台服务器中。

相关内容