2015-12-06 10 views
5

おかげさまで@brianlistが大変ありがとうございます。あなたの提案をお試しいただきました。値が$valueに渡されたかどうかわからないバルクコピーでこのエラーが表示されます。ローカルスコープのリモートスコープ

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

あなたは質問に誤りを編集していただきありがとうございますが、それについて話し合うために回答者にコメントする必要があります(回答者にも通知します)。スクリプトブロックから '$ mdtable'の値以上のものを返しているようです。使用している他のステートメントのどれもが値を返さないことを確認してください。もしそうであれば、 'Out-Null'にパイプを張ってそれらを抑制します(あるいは' $ null'に代入する)。 – briantist

+0

[多分関連](http://stackoverflow.com/q/1918190/1630171)。 –

+0

私は$ nRecsを作った| Out-Nullと同じエラーが表示されます。これはこのスクリプトの最後のステップです。だれでも問題を見つけるのを助けることができます –

答えて

4

あなたは既にInvoke-Commandスクリプトブロックから$mdtableの値を返すしています。その外の値を取得するには、単に変数にInvoke-Commandの結果をasign:この例では

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

$value$mdtableが持っていたものが含まれます。