我有一个脚本连接到数据库获取服务器列表查询,然后使用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 []就意味着它需要一个数组。
您还可以为服务器的初始查询创build一个SMO对象,然后重新使用SMO服务器连接执行将(磁盘信息)插入回到同一服务器的操作。