Export-Csv从全局变量到局部变量

时间:2015-12-01 18:54:55

标签: csv powershell-v2.0 export-to-csv

我试图将脚本的输出存储在本地变量的foreach循环中,然后从远程会话将其导出到本地系统上的CSV:

$cred = Get-Credential domain\username
$TargetSession = Get-Content C:\test\computers.txt

foreach ($Computer in $TargetSession) {
    $Session = New-PSSession $Computer -Credential $cred
    $result = Invoke-Command -Session $Session -ArgumentList $computer -ScriptBlock {
        $Database = "secaudit"

        #SMTP Relay Server
        $SMTPServer = "smtp.mail.net"
        $SqlQuery = "xp_fixeddrives"
        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $SqlConnection.ConnectionString = "Data Source=$computer;Initial Catalog=$Database;Integrated Security = True"
        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
        $SqlCmd.CommandText = $SqlQuery
        $SqlCmd.Connection = $SqlConnection
        $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
        $SqlAdapter.SelectCommand = $SqlCmd
        $DataSet = New-Object System.Data.DataSet
        $nRecs = $SqlAdapter.Fill($DataSet)
        $nRecs | Out-Null
        $objTable = $DataSet.Tables[0]
    } 

    $final = Invoke-Command -Session $Session -ScriptBlock {
        $result
    } | Export-Csv -Path c:\test\output_space.csv -NoTypeInformation

    Remove-PSSession -Session $Session
}

但我收到以下错误:

Export-Csv : Cannot bind argument to parameter 'InputObject' because it is null.
At C:\test\drivespace_mail.ps1:33 char:75
+ $final= Invoke-Command -Session $Session -ScriptBlock{$result}| Export-Csv <<<<  -path c:\test\output_space.csv -NoTypeInformation
   + CategoryInfo : InvalidData: (:) [Export-Csv],ParameterBindingValidationException
   + FullyQualifiedErrorId ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands`.ExportCsvCommand

1 个答案:

答案 0 :(得分:0)

scriptblocks中的变量与scriptblock之外的变量的范围不同,所以如果你有这样的代码:

$foo = 'something'
Invoke-Command -ScriptBlock { $foo }

你有两个不同的变量$foo,其中一个脚本块内的变量是空的,因为它从未被启动过。

您可以通过将脚本块中的变量作为参数传递到scriptblock中来使用外部作用域中的变量:

Invoke-Command -ScriptBlock {
  Param($foo)
  $foo
} -ArgumentList $foo

或通过using: scope modifier

Invoke-Command -ScriptBlock { $using:foo }

但是,您的第一个Invoke-Command从不输出/返回任何内容(所有输出都分配给变量,因此在调用返回时丢失)。因为没有任何内容被分配给$result,即使您在第二个scriptblock中访问该变量,也会得到相同的错误。

此外,您的双命令调用不必要地复杂化。只需使用这样的管道:

Get-Content 'C:\test\computers.txt' | ForEach-Object {
    Invoke-Command -Computer $_ -ScriptBlock {
        Param($computer)
        $Database = 'secaudit'
        ...
        $DataSet.Tables[0]
    } -ArgumentList $_ -Credential $cred
} | Export-Csv -Path 'C:\test\output_space.csv' -NoType