2015-12-06 21 views
5

cảm ơn rất nhiều @brianlist, tôi đã thử đề xuất của bạn và nó cho tôi lỗi này khi tôi sử dụng nó với bulkcopy, không chắc chắn nếu giá trị đã trôi qua trên $value.Phạm vi từ xa đến địa phương

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

Bạn nên bình luận về câu trả lời cho chính nó để thảo luận về nó (điều đó cũng thông báo cho người trả lời), mặc dù tôi đánh giá cao việc bạn chỉnh sửa lỗi trong câu hỏi. Có vẻ như bạn có thể không chỉ trả về giá trị '$ mdtable' từ tập lệnh chặn. Đảm bảo không có câu lệnh nào khác mà bạn đang sử dụng trả về một giá trị. Nếu họ làm, đường ống để 'Out-Null' để ngăn chặn chúng (hoặc gán cho' $ null'). – briantist

+0

[Có thể liên quan] (http://stackoverflow.com/q/1918190/1630171). –

+0

Tôi đã thực hiện $ nRecs | Out-Null và nó vẫn cho tôi lỗi tương tự. Đây là bước cuối cùng cho kịch bản này để làm việc, bất cứ ai có thể giúp tôi tìm ra vấn đề –

Trả lời

4

Bạn đã trở về giá trị của $mdtable từ Invoke-Command scriptblock. Để có được giá trị bên ngoài đó, chỉ cần asign kết quả của Invoke-Command cho một biến:

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

Trong ví dụ này, $value sẽ chứa những gì $mdtable có.

Các vấn đề liên quan