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 ...