Powershell을 사용하여 SQL 테이블에 사용 된 디스크 수집


0

DB에 연결하여 쿼리 할 서버 목록을 얻은 다음 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

    }


}

답변:


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 []이 표시 될 때마다 배열을 가져옵니다.


그것은 나에게 좋은 생각처럼 보인다-나는 그것을 조사 할 것이다. 감사합니다 차드!
Sam

이 코드를 보면 "foreach {$ _. SERVERHardwareName}"이 있고 $ ExportPath 및 Export-CSV가 설정됩니다. 이것이 csv에 마지막 SERVERHardwareName 정보 만 포함하지 않습니까?
Sam

아니요. 사용중인 유일한 각 서버 변수를로드하는 것입니다. 심지어 거기에서도 "| foreach {$ _. SERVERHardwareName}"대신 "| select -expand SERVERHardwareName"을 사용할 수있었습니다
Chad Miller

귀하의 설명과 답변에 매우 감사합니다-완벽합니다!
Sam

0

또한 초기 서버 쿼리에 대해 SMO 객체를 생성 한 다음 SMO 서버 연결을 재사용하여 디스크 정보를 동일한 서버에 다시 삽입 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.