2015-12-06 8 views
5

Vielen Dank @brianlist, ich habe Ihren Vorschlag versucht und es gibt mir diesen Fehler, wenn ich es mit Bulkcopy verwenden, nicht sicher, ob der Wert an $value weitergegeben wurde. Remote-Bereich zu lokalen

Cannot convert argument "0", with value: "System.Object[]", for "WriteToServer" 
to type "System.Data.DataRow[]": "Cannot convert the "System.Data.DataRow" value 
of type "Deserialized.System.Data.DataRow" to type "System.Data.DataRow"." 
At C:\test\modified.ps1:11 char:24 
+ $bulkCopy.WriteToServer <<<< ($value) 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument 
Get-Content 'C:\test\computers.txt' | ? { $_.trim() -ne "" } | ForEach-Object { 
    $value = Invoke-Command -Computer $_ -ScriptBlock { 
     Param($computer) 
     #.. 
     $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
     $global:mdtable = New-Object System.Data.DataTable 
     $SqlAdapter.SelectCommand = $SqlCmd 
     $nRecs = $SqlAdapter.Fill($mdtable) 
     $mdtable 
    } -ArgumentList $_ -Credential $cred 
} | test 

Function test { 
    $Database = 'Test1' 
    $table = 'dbo.table_2' 
    $connectionstring = "Data Source=mylocal;Integrated Security=True;Initial Catalog=$Database" 
    $Conn = New-Object System.Data.SqlClient.SQLConnection($connectionstring) 
    $conn.open() 
    $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($conn) 
    $bulkcopy.DestinationTableName = $table 
    $bulkCopy.WriteToServer($value) 
    $conn.close() 
} 
+1

Sie sollten die Antwort selbst kommentieren, um sie zu besprechen (dies benachrichtigt auch den Beantworter), obwohl ich es schätze, dass Sie den Fehler in die Frage bearbeitet haben. Es sieht so aus, als könnten Sie mehr als nur den Wert von $ mdtable aus dem Skriptblock zurückgeben. Stellen Sie sicher, dass keine der anderen Anweisungen, die Sie verwenden, einen Wert zurückgibt. Wenn sie dies tun, pipere sie nach "Out-Null", um sie zu unterdrücken (oder weise sie $ $ null zu). – briantist

+0

[Vielleicht verwandt] (http://stackoverflow.com/q/1918190/1630171). –

+0

Ich habe $ nRecs | gemacht Out-Null und es gibt mir immer noch den gleichen Fehler. Dies ist der letzte Schritt, damit dieses Skript funktioniert. Kann mir jemand helfen, das Problem herauszufinden? –

Antwort

4

Sie Rückkehr bereits den Wert von $mdtable vom Invoke-Command Skript. Um den Wert außerhalb davon zu bekommen, asign nur das Ergebnis Invoke-Command eine Variablen:

Get-Content 'C:\test\computers.txt'| ? {$_.trim() -ne "" } | ForEach-object{ 
    $value = Invoke-Command -Computer $_ -ScriptBlock { 
     Param($computer) 
     # ... 
     $mdtable 
    } 

In diesem Beispiel $value enthalten, was $mdtable hatte.