Powershell:将SQL查询中的列与WMI结果组合
脚本的第一步从SQL表中提取3个字段。 第二步获取服务器名称并循环服务器名称以获取更多信息。 我的目标是将SQL表中的其他两列与输出中从WMI收集的信息结合起来Powershell:将SQL查询中的列与WMI结果组合,powershell,variables,Powershell,Variables,脚本的第一步从SQL表中提取3个字段。 第二步获取服务器名称并循环服务器名称以获取更多信息。 我的目标是将SQL表中的其他两列与输出中从WMI收集的信息结合起来 #SQL Variables $SQLServer = 'remoteservername' $Database = 'Dbname' #Create a SQL Query function Function SQL_Query ($Query) { $SqlConnection = New-Object Syst
#SQL Variables
$SQLServer = 'remoteservername'
$Database = 'Dbname'
#Create a SQL Query function
Function SQL_Query ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SQLServer;Database=$Database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = $Query
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a = $SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]
} #End SQL Query Function
$Servers = SQL_Query "SELECT
Servername, Status, Purpose
FROM tablename "
$Results = $Servers | Select-Object -ExpandProperty ServerName
#loop through servers
$Output = @()
$Output =Foreach ($Server in $Results)
{
$Servers # This variable stores Servername, Status, and Purpose information. I want the Status and Purpose fields to show up in the loop below. The idea is if the Servername from $servers matches $server,add the extra 2 fields from #Servers
$BootTime = GET-WmiObject win32_Operatingsystem -ComputerName $server -EA STOP | select @{n='ServerName';e={$_.csname}},@{n='LastBootUpTime';e={$_.ConverttoDateTime($_.lastbootuptime)}}`
,@{n='LocalTime';e={$_.ConverttoDateTime($_.LocalDateTime)}} ,@{n='UpTime';e={"Uptime:" + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Days + " Days " +`
((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Hours + " Hours " + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Minutes + " Minutes "}},@{n='OS';e={$_.caption}}
}
#Display Out here
$Boottime | Select ServerName,LastBootUpTime,Uptime,Status,Purpose |Out-GridView
您可以在循环中使用$Servers而不是$Results,并将$server数据添加到select @{n='Status';e={$Server.Status},@{n='Purpose';e={$Server.Purpose} 结果代码如下所示:
#SQL Variables
$SQLServer = 'remoteservername'
$Database = 'Dbname'
#Create a SQL Query function
Function SQL_Query ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SQLServer;Database=$Database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = $Query
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a = $SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]
} #End SQL Query Function
= SQL_Query "SELECT
Servername, Status, Purpose
FROM tablename "
#dont need this
#$Results = $Servers | Select-Object -ExpandProperty ServerName
#loop through servers
$Output = @()
$Output = Foreach ($Server in $Servers) {
#set this variable to be used in the ComputerName param
$serverName = $Server.Servername
#dont need this
#$Servers # This variable stores Servername, Status, and Purpose information. I want the Status and Purpose fields to show up in the loop below. The idea is if the Servername from $servers matches $server,add the extra 2 fields from #Servers
GET-WmiObject win32_Operatingsystem -ComputerName $serverName -EA STOP | select @{n = 'ServerName'; e = { $_.csname } }, @{n = 'LastBootUpTime'; e = { $_.ConverttoDateTime($_.lastbootuptime) } }`
, @{n = 'LocalTime'; e = { $_.ConverttoDateTime($_.LocalDateTime) } } , @{n = 'UpTime'; e = { "Uptime:" + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Days + " Days " + `
((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Hours + " Hours " + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Minutes + " Minutes " }
}, @{n = 'OS'; e = { $_.caption } }, @{n = 'Status'; e = { $Server.Status } }, @{n = 'Purpose'; e = { $Server.Purpose } }
#see the added columns above Status and Purpose
}
#Display Out here
$Output | Select ServerName, LastBootUpTime, Uptime, Status, Purpose | Out-GridView
您可以在循环中使用$Servers而不是$Results,并将$server数据添加到select @{n='Status';e={$Server.Status},@{n='Purpose';e={$Server.Purpose} 结果代码如下所示:
#SQL Variables
$SQLServer = 'remoteservername'
$Database = 'Dbname'
#Create a SQL Query function
Function SQL_Query ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SQLServer;Database=$Database;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = $Query
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a = $SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]
} #End SQL Query Function
= SQL_Query "SELECT
Servername, Status, Purpose
FROM tablename "
#dont need this
#$Results = $Servers | Select-Object -ExpandProperty ServerName
#loop through servers
$Output = @()
$Output = Foreach ($Server in $Servers) {
#set this variable to be used in the ComputerName param
$serverName = $Server.Servername
#dont need this
#$Servers # This variable stores Servername, Status, and Purpose information. I want the Status and Purpose fields to show up in the loop below. The idea is if the Servername from $servers matches $server,add the extra 2 fields from #Servers
GET-WmiObject win32_Operatingsystem -ComputerName $serverName -EA STOP | select @{n = 'ServerName'; e = { $_.csname } }, @{n = 'LastBootUpTime'; e = { $_.ConverttoDateTime($_.lastbootuptime) } }`
, @{n = 'LocalTime'; e = { $_.ConverttoDateTime($_.LocalDateTime) } } , @{n = 'UpTime'; e = { "Uptime:" + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Days + " Days " + `
((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Hours + " Hours " + ((GET-DAte) - $_.ConverttoDateTime($_.lastbootuptime)).Minutes + " Minutes " }
}, @{n = 'OS'; e = { $_.caption } }, @{n = 'Status'; e = { $Server.Status } }, @{n = 'Purpose'; e = { $Server.Purpose } }
#see the added columns above Status and Purpose
}
#Display Out here
$Output | Select ServerName, LastBootUpTime, Uptime, Status, Purpose | Out-GridView
对于更干净的代码,我不会在这里使用带有计算属性的
Select对象
,而是让循环直接发出PsCustomObject
s
#loop through servers
$result = foreach ($server in $Servers) {
try {
$os = Get-WmiObject Win32_Operatingsystem -ComputerName $server.ServerName -ErrorAction Stop
$lastBoot = $os.ConverttoDateTime($os.LastBootUpTime)
$localTime = $os.ConverttoDateTime($os.LocalDateTime)
$upTime = (Get-Date) - $lastBoot
# output a PsObject
[PsCustomObject]@{
'ServerName' = $os.CSName
'LastBootUpTime' = $lastBoot
'LocalTime' = $localTime
'UpTime' = '{0} Days {1} Hours {2} Minutes' -f $upTime.Days, $upTime.Hours, $upTime.Minutes
'OS' = $os.Caption
'Status' = $server.Status
'Purpose' = $server.Purpose
}
}
catch {
Write-Warning "WMI Query failed on computer '$($server.ServerName)'"
}
}
# Display the result here
$result | Out-GridView
如果您的PowerShell版本为3.0或更高版本,则可以将代码更改为使用
Get-CimInstance
而不是Get-WmiObject
,以获得更好的性能。看
这样做还意味着您不必转换LastBootUpTime
和LocalDateTime
属性,因为它们已经是真正的DateTime对象
代码将改为:
#loop through servers
$result = foreach ($server in $Servers) {
try {
$os = Get-CimInstance -ClassName Win32_Operatingsystem -ComputerName $server.ServerName -ErrorAction Stop
$upTime = (Get-Date) - $os.LastBootUpTime
# output a PsObject
[PsCustomObject]@{
'ServerName' = $os.CSName
'LastBootUpTime' = $os.LastBootUpTime
'LocalTime' = $os.LocalDateTime
'UpTime' = '{0} Days {1} Hours {2} Minutes' -f $upTime.Days, $upTime.Hours, $upTime.Minutes
'OS' = $os.Caption
'Status' = $server.Status
'Purpose' = $server.Purpose
}
}
catch {
Write-Warning "WMI Query failed on computer '$($server.ServerName)'"
}
}
# Display the result here
$result | Out-GridView
对于更干净的代码,我不会在这里使用带有计算属性的
Select对象
,而是让循环直接发出PsCustomObject
s
#loop through servers
$result = foreach ($server in $Servers) {
try {
$os = Get-WmiObject Win32_Operatingsystem -ComputerName $server.ServerName -ErrorAction Stop
$lastBoot = $os.ConverttoDateTime($os.LastBootUpTime)
$localTime = $os.ConverttoDateTime($os.LocalDateTime)
$upTime = (Get-Date) - $lastBoot
# output a PsObject
[PsCustomObject]@{
'ServerName' = $os.CSName
'LastBootUpTime' = $lastBoot
'LocalTime' = $localTime
'UpTime' = '{0} Days {1} Hours {2} Minutes' -f $upTime.Days, $upTime.Hours, $upTime.Minutes
'OS' = $os.Caption
'Status' = $server.Status
'Purpose' = $server.Purpose
}
}
catch {
Write-Warning "WMI Query failed on computer '$($server.ServerName)'"
}
}
# Display the result here
$result | Out-GridView
如果您的PowerShell版本为3.0或更高版本,则可以将代码更改为使用
Get-CimInstance
而不是Get-WmiObject
,以获得更好的性能。看
这样做还意味着您不必转换LastBootUpTime
和LocalDateTime
属性,因为它们已经是真正的DateTime对象
代码将改为:
#loop through servers
$result = foreach ($server in $Servers) {
try {
$os = Get-CimInstance -ClassName Win32_Operatingsystem -ComputerName $server.ServerName -ErrorAction Stop
$upTime = (Get-Date) - $os.LastBootUpTime
# output a PsObject
[PsCustomObject]@{
'ServerName' = $os.CSName
'LastBootUpTime' = $os.LastBootUpTime
'LocalTime' = $os.LocalDateTime
'UpTime' = '{0} Days {1} Hours {2} Minutes' -f $upTime.Days, $upTime.Hours, $upTime.Minutes
'OS' = $os.Caption
'Status' = $server.Status
'Purpose' = $server.Purpose
}
}
catch {
Write-Warning "WMI Query failed on computer '$($server.ServerName)'"
}
}
# Display the result here
$result | Out-GridView
删除Select对象的用法并更正变量用法解决了我的问题“foreach($server in$Servers)”。我实际上使用psCustomObject,但当我在这里发布问题时,我缩短了代码。感谢您引入Get-CimInstance,我尝试过使用它,但不幸的是我有一些2008操作系统。删除Select对象的用法并更正变量用法解决了我的问题“foreach($server in$Servers)”。我实际上使用psCustomObject,但当我在这里发布问题时,我缩短了代码。感谢您介绍Get-CimInstance,我尝试过使用它,但不幸的是我有一些2008操作系统。没错,只需切换到使用$servers即可解决我的问题!没错,只要切换到使用$servers就可以解决我的问题!