Powershell 错误 - Null/Empty 参数
Powershell Error - Null/Empty Argument
我有一个小型 powershell 脚本,用于从名为 Hal0Test > 来自 table、ServerList 的远程 SQL 数据库中获取列 ServerName。但是,我无法弄清楚这个 Powershell 错误。
最新代码:
Write-Output " `n Start of Hal0 `n";
$connectionString = "Server=QAUTILITYDB01;Database=Hal0Test;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$ServerArray = [System.Collections.ArrayList]@()
$query = "SELECT ServerName FROM ServerList"
$command.CommandText = $query
$ServerNames = $command.ExecuteReader()
$table = new-object “System.Data.DataTable”
$table.Load($ServerNames)
$ServerArray = $table | select -Expand ServerName
$ServerArray | ForEach-Object {
# $Server returns each server name
$os = Get-WmiObject -Class Win32_OperatingSystem -Computer $_
$disks = Get-WmiObject -Class Win32_LogicalDisk -Computer $_ |
Where-Object {$_.DriveType -eq 3} |
ForEach-Object {
'{0} {1:D} MB Free/{2:D} MB Used' -f $_.DeviceID,
[int]($_.FreeSpace/1MB), [int]($_.Size/1MB)
}
New-Object -Type PSCustomObject -Property @{
'FQDN' = $_
'ServerName' = $os.PSComputerName
'OperatingSystem' = $os.Caption
'Disks' = $disks -join ' | '
}
$command.CommandText = "UPDATE ServerList SET FQDN = '$_', OS = '$os.Caption' WHERE ServerName = '$os.PSComputerName';"
$result = $command.ExecuteNonQuery()
} | Export-Csv 'C:\Users\king\Desktop\HalO\output.csv' -Delimiter '|' -NoType
Write-Output "`n End of Hal0";
SQL Table:
您需要使用 [datatable]
来存储您的 select:
的结果
$connectionString = "Server=QAUTILITYDB01;Database=Hal0Test;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$ServerArray = [System.Collections.ArrayList]@()
$query = "SELECT ServerName FROM ServerList"
$command.CommandText = $query
$ServerNames = $command.ExecuteReader()
$table = new-object "System.Data.DataTable"
$table.Load($ServerNames)
现在 $table
有您的服务器名称列表。
您将我的 ForEach-Object
循环更改为 foreach
循环。如果要使用后者,则需要将当前对象变量 $_
更改为循环变量 $Server
:
foreach($ServerArray 中的$Server){
$os = Get-WmiObject -Class Win32_OperatingSystem -Computer <b>$Server</b>
$disks = Get-WmiObject -Class Win32_LogicalDisk -计算机 <b>$Server</b> | ...
...
}
否则您需要将循环改回 ForEach-Object
循环:
<b>$ServerArray | ForEach-对象</b> {
$os = Get-WmiObject -Class Win32_OperatingSystem -计算机 $_
$disks = Get-WmiObject -Class Win32_LogicalDisk -计算机 $_ | ...
...
}
此外,}
和 Export-Csv
之间没有管道:
$result = $command.ExecuteNonQuery()
} Export-Csv 'C:\Users\mdaraghmeh\Desktop\HalO\output.csv' -Delimiter '|' -NoType
^
here
即使有,foreach
循环仍然无法将其输出送入管道。如果要将 foreach
与管道一起使用,则必须将输出分配给变量:
$output = foreach ($Server in $ServerArray) { ... }
$output | Export-Csv ...
或运行它在一个表达式中:
(foreach ($Server in $ServerArray) { ... }) | Export-Csv ...
对于直接管道处理,您需要一个 ForEach-Object
循环:
$ServerArray | ForEach-Object { ... } | Export-Csv ...
我有一个小型 powershell 脚本,用于从名为 Hal0Test > 来自 table、ServerList 的远程 SQL 数据库中获取列 ServerName。但是,我无法弄清楚这个 Powershell 错误。
最新代码:
Write-Output " `n Start of Hal0 `n";
$connectionString = "Server=QAUTILITYDB01;Database=Hal0Test;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$ServerArray = [System.Collections.ArrayList]@()
$query = "SELECT ServerName FROM ServerList"
$command.CommandText = $query
$ServerNames = $command.ExecuteReader()
$table = new-object “System.Data.DataTable”
$table.Load($ServerNames)
$ServerArray = $table | select -Expand ServerName
$ServerArray | ForEach-Object {
# $Server returns each server name
$os = Get-WmiObject -Class Win32_OperatingSystem -Computer $_
$disks = Get-WmiObject -Class Win32_LogicalDisk -Computer $_ |
Where-Object {$_.DriveType -eq 3} |
ForEach-Object {
'{0} {1:D} MB Free/{2:D} MB Used' -f $_.DeviceID,
[int]($_.FreeSpace/1MB), [int]($_.Size/1MB)
}
New-Object -Type PSCustomObject -Property @{
'FQDN' = $_
'ServerName' = $os.PSComputerName
'OperatingSystem' = $os.Caption
'Disks' = $disks -join ' | '
}
$command.CommandText = "UPDATE ServerList SET FQDN = '$_', OS = '$os.Caption' WHERE ServerName = '$os.PSComputerName';"
$result = $command.ExecuteNonQuery()
} | Export-Csv 'C:\Users\king\Desktop\HalO\output.csv' -Delimiter '|' -NoType
Write-Output "`n End of Hal0";
SQL Table:
您需要使用 [datatable]
来存储您的 select:
$connectionString = "Server=QAUTILITYDB01;Database=Hal0Test;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$ServerArray = [System.Collections.ArrayList]@()
$query = "SELECT ServerName FROM ServerList"
$command.CommandText = $query
$ServerNames = $command.ExecuteReader()
$table = new-object "System.Data.DataTable"
$table.Load($ServerNames)
现在 $table
有您的服务器名称列表。
您将我的 ForEach-Object
循环更改为 foreach
循环。如果要使用后者,则需要将当前对象变量 $_
更改为循环变量 $Server
:
foreach($ServerArray 中的$Server){
$os = Get-WmiObject -Class Win32_OperatingSystem -Computer <b>$Server</b>
$disks = Get-WmiObject -Class Win32_LogicalDisk -计算机 <b>$Server</b> | ...
...
}
否则您需要将循环改回 ForEach-Object
循环:
<b>$ServerArray | ForEach-对象</b> {
$os = Get-WmiObject -Class Win32_OperatingSystem -计算机 $_
$disks = Get-WmiObject -Class Win32_LogicalDisk -计算机 $_ | ...
...
}
此外,}
和 Export-Csv
之间没有管道:
$result = $command.ExecuteNonQuery()
} Export-Csv 'C:\Users\mdaraghmeh\Desktop\HalO\output.csv' -Delimiter '|' -NoType
^
here
即使有,foreach
循环仍然无法将其输出送入管道。如果要将 foreach
与管道一起使用,则必须将输出分配给变量:
$output = foreach ($Server in $ServerArray) { ... }
$output | Export-Csv ...
或运行它在一个表达式中:
(foreach ($Server in $ServerArray) { ... }) | Export-Csv ...
对于直接管道处理,您需要一个 ForEach-Object
循环:
$ServerArray | ForEach-Object { ... } | Export-Csv ...