我试图将脚本的输出存储在本地变量的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
答案 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