2010-11-11 76 views
0

我正在編寫一個Powershell腳本,它將從ZIP文件中提取一組數據文件,然後將它們附加到服務器上。我寫了一個函數,它的解壓縮的照顧,因爲我需要抓住所有的文件,讓我知道我安裝我返回從功能:Powershell中的數據類型轉換問題

function Unzip-Files 
{ 
    param([string]$zip_path, [string]$zip_filename, [string]$target_path, [string]$filename_pattern) 

    # Append a \ if the path doesn't already end with one 
    if (!$zip_path.EndsWith("\")) {$zip_path = $zip_path + "\"} 
    if (!$target_path.EndsWith("\")) {$target_path = $target_path + "\"} 

    # We'll need a string collection to return the files that were extracted 
    $extracted_file_names = New-Object System.Collections.Specialized.StringCollection 

    # We'll need a Shell Application for some file movement 
    $shell_application = New-Object -com shell.Application 

    # Get a handle for the target folder 
    $target_folder = $shell_application.NameSpace($target_path) 

    $zip_full_path = $zip_path + $zip_filename 

    if (Test-Path($zip_full_path)) 
    { 
     $target_folder = $shell_application.NameSpace($target_path) 
     $zip_folder = $shell_application.NameSpace($zip_full_path) 

     foreach ($zipped_file in $zip_folder.Items() | Where {$_.Name -like $filename_pattern}) 
     { 
      $extracted_file_names.Add($zipped_file.Name) | Out-Null 
      $target_folder.CopyHere($zipped_file, 16) 
     } 
    } 

    $extracted_file_names 
} 

我然後調用另一個函數實際上附加數據庫(我已經刪除了一些代碼,檢查數據庫的存在,但不應該在這裏影響的東西):

function Attach-Database 
{ 
    param([object]$server, [string]$database_name, [object]$datafile_names) 

    $database = $server.Databases[$database_name] 

    $server.AttachDatabase($database_name, $datafile_names) 

    $database = $server.Databases[$database_name] 

    Return $database 
} 

我不斷收到一個錯誤,雖然,「不能轉換參數」 1 「,值爲」System.Object []「,」AttachDatabase「用於鍵入」System.Collections.Specialized.StringCollection「」。

我試過在各個點顯式聲明數據類型,但這只是改變我得到錯誤(或類似於它的一個位置)的位置。我也改變了參數聲明來使用字符串集合而不是沒有運氣的對象。

我從一個字符串集合開始,最終想要消費一個字符串集合。我似乎無法讓Powershell在某個時刻停止嘗試將其轉換爲通用對象。

有什麼建議嗎?

謝謝!

回答

1

看起來你應該返回使用逗號操作符的名字:

... 
    , $extracted_file_names 
} 

避免「展開」收集到的物品,並保留原始集合對象。

有這樣幾個問題,這裏只是一對夫婦:

Strange behavior in PowerShell function returning DataSet/DataTable

Loading a serialized DataTable in PowerShell - Gives back array of DataRows not a DataTable

UPDATE:

此類似代碼的工作:

Add-Type @' 
using System; 
using System.Collections.Specialized; 

public static class TestClass 
{ 
    public static string TestMethod(StringCollection data) 
    { 
     string result = ""; 
     foreach (string s in data) 
     result += s; 
     return result; 
    } 
} 
'@ 

function Unzip-Files 
{ 
    $extracted_file_names = New-Object System.Collections.Specialized.StringCollection 

    foreach ($zipped_file in 'xxx', 'yyy', 'zzz') 
    { 
     $extracted_file_names.Add($zipped_file) | Out-Null 
    } 

    , $extracted_file_names 
} 

function Attach-Database 
{ 
    param([object]$datafile_names) 

    # write the result 
    Write-Host ([TestClass]::TestMethod($datafile_names)) 
} 

# get the collection 
$names = Unzip-Files 

# write its type 
Write-Host $names.GetType() 

# pass it in the function 
Attach-Database $names 

由於預計,它的輸出是:

System.Collections.Specialized.StringCollection 
xxxyyyzzz 

如果我刪除的建議逗號,然後我們得到:

System.Object[] 
Cannot convert argument "0", with value: "System.Object[]", 
for "TestMethod" to type "System.Collections.Specialized.StringCollection"... 

症狀看起來是一樣的,因此該解決方案想必應該工作也是如此,如果沒有其他不必要的轉換/在Unzip-FilesAttach-Database調用之間的省略代碼中展開。

+0

我建議已經(我的答案在下面刪除),它沒有工作。 – Joey 2010-11-11 23:44:09

+0

嗯,我看不到刪除的答案:)。爲什麼它不工作? – 2010-11-11 23:50:30

+0

對不起,它看起來確實解決了問題。喬伊,如果你取消了你的回答,那麼我可以接受它。 +1羅馬。感謝你們倆! – 2010-11-12 15:55:03