2014-05-11 2 views
0

Powershell 및 SQL Server를 사용하여 VMware vCenter에서 수집 한 데이터를 데이터베이스에 삽입하려고합니다.Powershell을 사용하여 SQL Server의 여러 열에 데이터 삽입

$conn = New-Object System.Data.SqlClient.SqlConnection 
$conn.ConnectionString = "Data Source=.\sqlexpress;Initial Catalog=Computer;Integrated Security=SSPI;" 
$conn.open() 
$cmd = New-Object System.Data.SqlClient.SqlCommand 
$cmd.connection = $conn 

$val = 0 
$clusterinf = foreach($cluster in Get-Cluster){ 
$esx = $cluster | Get-VMHost 
$ds = Get-Datastore -VMHost $esx | where {$_.Type -eq "VMFS"} 

$cluster | Select @{N="VCname";E={$cluster.Uid.Split(':@')[1]}}, 
    @{N="DCname";E={(Get-Datacenter -Cluster $cluster).Name}}, 
    @{N="Clustername";E={$cluster.Name}},   
    @{N="TotalPhysicalMemory";E={[Math]::Round(($esx | Measure-Object -Property MemoryTotalMB -Sum).Sum /1KB)}}, 
    @{N="TotalUsedMemory";E={[Math]::Round(($esx | Measure-Object -Property MemoryUsageMB -Sum).Sum /1KB)}}, 
    @{N="AvailableMemroy";E={[Math]::Round(($esx | Measure-Object -InputObject {$_.MemoryTotalMB - $_.MemoryUsageMB} -Sum).Sum /1KB)}}, 
    @{N="TotalCPU";E={[Math]::Round(($esx | Measure-Object -Property CpuTotalMhz -Sum).Sum /1KB)}}, 
    @{N="TotalUsedCPU";E={[Math]::Round(($esx | Measure-Object -Property CpuUsageMhz -Sum).Sum /1KB)}}, 
    @{N="AvailableCPU";E={[Math]::Round(($esx | Measure-Object -InputObject {$_.CpuTotalMhz - $_.CpuUsageMhz} -Sum).Sum /1KB)}}, 
    @{N="TotalDiskSpace";E={[Math]::Round(($ds | where {$_.Type -eq "VMFS"} | Measure-Object -Property CapacityMB -Sum).Sum /1KB)}}, 
    @{N="ConfiguredDiskSpace";E={[Math]::Round(($ds | Measure-Object -InputObject {$_.CapacityMB - $_.FreeSpaceMB} -Sum).Sum /1KB)}}, 
    @{N="AvailableDiskSpace";E={[Math]::Round(($ds | Measure-Object -Property FreeSpaceMB -Sum).Sum /1KB)}}, 
    @{N="Total Configured Memory GB For Powered on VMs";E={[Math]::Round(($_ | Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | %{$_.MemoryMB} | Measure-Object -Sum | Select -ExpandProperty Sum)/1KB) }} 

$cmd.commandtext = "INSERT INTO Clusterinfo (VCname) VALUES('{$val}')" -f $clusterinf.VCname 
$cmd.ExecuteNonQuery() 
$val++  

} 
$conn.close() 

그리고 이것은 내가 믿는 의도 한대로 작동 :

이것은 내가 지금 가지고있는 것입니다. 이제 내 질문은, 다음 칼럼을 계속하려면 어떻게해야합니까? 그래서 DCname, Clustername, TotalPhysicalMemory 등등을 추가 할 수 있습니까?

나는이 삽입 문을 시도하고있다 :

$cmd.commandtext = "INSERT INTO Clusterinfo (VCname, DCname, CLustername) VALUES('$($clusterinf.VCname)','$($clusterinf.DCname)','$($clusterinf.Clustername)')" 

그러나 삽입하므로 그것 정말, 원하는 결과를 포기하지 않을 모든 VCname, DCname 등등, 하나의 행에, 그리고 다른 행에 . Powershell How to query multiple classes and write in to SQL Table

을하지만 내 자신의 질문에 대한 해결책의 주위에 내 머리를 얻이 수없는 것 :

은이 질문에서 찾고있다.

아무도이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

0

$clusterinf은 foreach-loop의 결과가 아닌 현재 클러스터의 데이터가있는 개체 여야합니다. 당신은 매개 변수 값의 CommandText를 교체해야합니다, 보조 노트로

$conn = New-Object System.Data.SqlClient.SqlConnection 
$conn.ConnectionString = "Data Source=.\sqlexpress;Initial Catalog=Computer;Integrated Security=SSPI;" 
$conn.open() 
$cmd = New-Object System.Data.SqlClient.SqlCommand 
$cmd.connection = $conn 

foreach($cluster in (Get-Cluster)){ 

    $esx = $cluster | Get-VMHost 
    $ds = Get-Datastore -VMHost $esx | where {$_.Type -eq "VMFS"} 

    $clusterinf = $cluster | Select @{N="VCname";E={$cluster.Uid.Split(':@')[1]}}, 
     @{N="DCname";E={(Get-Datacenter -Cluster $cluster).Name}}, 
     @{N="Clustername";E={$cluster.Name}},   
     @{N="TotalPhysicalMemory";E={[Math]::Round(($esx | Measure-Object -Property MemoryTotalMB -Sum).Sum /1KB)}}, 
     @{N="TotalUsedMemory";E={[Math]::Round(($esx | Measure-Object -Property MemoryUsageMB -Sum).Sum /1KB)}}, 
     @{N="AvailableMemroy";E={[Math]::Round(($esx | Measure-Object -InputObject {$_.MemoryTotalMB - $_.MemoryUsageMB} -Sum).Sum /1KB)}}, 
     @{N="TotalCPU";E={[Math]::Round(($esx | Measure-Object -Property CpuTotalMhz -Sum).Sum /1KB)}}, 
     @{N="TotalUsedCPU";E={[Math]::Round(($esx | Measure-Object -Property CpuUsageMhz -Sum).Sum /1KB)}}, 
     @{N="AvailableCPU";E={[Math]::Round(($esx | Measure-Object -InputObject {$_.CpuTotalMhz - $_.CpuUsageMhz} -Sum).Sum /1KB)}}, 
     @{N="TotalDiskSpace";E={[Math]::Round(($ds | where {$_.Type -eq "VMFS"} | Measure-Object -Property CapacityMB -Sum).Sum /1KB)}}, 
     @{N="ConfiguredDiskSpace";E={[Math]::Round(($ds | Measure-Object -InputObject {$_.CapacityMB - $_.FreeSpaceMB} -Sum).Sum /1KB)}}, 
     @{N="AvailableDiskSpace";E={[Math]::Round(($ds | Measure-Object -Property FreeSpaceMB -Sum).Sum /1KB)}}, 
     @{N="Total Configured Memory GB For Powered on VMs";E={[Math]::Round(($_ | Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | %{$_.MemoryMB} | Measure-Object -Sum | Select -ExpandProperty Sum)/1KB) } } 

    $cmd.commandtext = "INSERT INTO Clusterinfo (VCname, Clustername, TotalPhysicalMemory, TotalUsedMemory, AvailableMemroy, TotalCPU, TotalUsedCPU, AvailableCPU, TotalDiskSpace, ConfiguredDiskSpace, AvailableDiskSpace) VALUES('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')" -f $clusterinf.VCname, $clusterinf.Clustername, $clusterinf.TotalPhysicalMemory, $clusterinf.TotalUsedMemory, $clusterinf.AvailableMemroy, $clusterinf.TotalCPU, $clusterinf.TotalUsedCPU, $clusterinf.AvailableCPU, $clusterinf.TotalDiskSpace, $clusterinf.ConfiguredDiskSpace, $clusterinf.AvailableDiskSpace 
    $cmd.ExecuteNonQuery() 
} 

$conn.close() 

:

나는 이런 식으로 뭔가를 시도 할 것입니다. 그것은 SQL injection에 덜 취약하고 내 opinon에서 많은 청소기입니다. this link

+1

F를 부탁드립니다. 대단히 감사합니다. 완벽하게 작동합니다. 실제로 스크립트를 사용하여 그런 식으로 작업하려고했지만 데이터베이스에서는 값 대신 "System.Object []"만 삽입했습니다. 그래서 foreach 루프 내에서 $ clusterinf를 움직여서 의도 한 것처럼 작동합니다. 내가 그걸 못 본 것 같아. 다시 말하지만, 나에게 그것을 지적 해 주신 것에 감사드립니다. 그리고 또한, 사이드 노트를 주셔서 감사합니다, 나는 그것을 들여다 볼 것입니다. 좋은 저녁 되세요. –

관련 문제