2015-12-06 15 views
5

dzięki dużo @brianlist, Próbowałem swoje sugestie i to daje mi ten błąd, gdy używam go bulkcopy, nie wiem, czy wartość jest przekazywana do $value.Remote zakres lokalnych

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

powinien wypowiedzieć się na temat samej odpowiedzi, aby to omówić (które również informuje odpowiadającego), choć doceniam edytowania błąd w pytaniu. Wygląda na to, że możesz zwrócić więcej niż wartość '$ mdtable' z bloku skryptu. Upewnij się, że żadna z pozostałych instrukcji, których używasz, nie zwraca wartości. Jeśli tak, przeprowadź do 'Out-Null', aby je wyłączyć (lub przypisz do' $ null'). – briantist

+0

[Może powiązane] (http://stackoverflow.com/q/1918190/1630171). –

+0

Zrobiłem $ nRecs | Out-Null i nadal daje mi ten sam błąd. To jest ostatni krok do działania tego skryptu. Czy ktoś może mi pomóc w rozwiązaniu problemu? –

Odpowiedz

4

Jesteś już zwrotu wartości $mdtable z Invoke-Command scriptblock. Aby uzyskać wartość poza tym, po prostu asign wynik Invoke-Command do zmiennej:

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

w tym przykładzie, $value będzie zawierać co $mdtable miałem.