2011-10-17 8 views
0

私はよく1〜2週間でPowerShellスクリプトを使って作業しています。私はそれの一部を得ることができましたが、私は完全にこれを自動化することができません。Powershell - 複数のCSVを一意のフォルダにエクスポート

私は日常的に多くのCSVファイルを扱いますが、ソフトウェアにアップロードすることが任されていますが、扱うには大きすぎることもありますので、 "タイプ"に基づいて打ち切りますCSVの列)、それを「タイプ」ごとに1つのCSVにエクスポートします。私はこれを次のように達成することができました:

$file = gci -Filter "*.csv"; 
Import-Csv $file ` 
| Group-Object –Property “type” ` 
| Foreach-Object ` 
    { 
     $path=$_.name+”.csv” ; $_.group ` 
     | Export-Csv –Path $path –NoTypeInformation 
    } 

これは、個々のCSVごとに素晴らしく機能します。残念ながら、私は個々のCSVごとにこれを行う時間がありません。今、私は私の他のPowerShellスクリプトに来る:これは効果的に機能していない「なぜ」

get-childitem -Filter "*.csv" ` 
| select-object basename ` 
    | foreach-object{ $path=$_.basename+".csv" #iterate through files. 
     if(!(Test-Path -path $_.basename)) #If the folder of the file can't be found then it will attempt to create it. 
     { 
      New-Item $_.basename -type directory; $file=$_.basename+".csv"; 
      Import-Csv $file ` 
      | Group-Object -Property "Type" ` 
      | Foreach-Object { 
       $path=$_.name+".csv"; $_.group ` 
       | ` 
        if(!(Test-Path -path $path2)) 
        { 
         New-Item $path2 -type directory 
         Export-Csv -Path $path2 + "\" + $path -NoTypeInformation 
        } 
        else 
        { 
         "Failed on: " + $_.basename 
         #Export-Csv -Path $_.basename + "\" + $path -NoTypeInformation 
        }      
       } 
     } 
     else 
     { 
     Import-Csv $path ` 
      | Group-Object -Property "Type" ` 
      | Foreach-Object {$path=$_.basename+".csv" ; $_.group      
       if(Test-Path -path $._) 
        { 
         New-Item $path2 -type directory 
         Export-Csv -Path $path2 + "\" + $path -NoTypeInformation 
        } 
        #else 
        #{ 
         Write-Host "Failed on: $_.basename" 
         #Export-Csv -Path $_.basename + "\" + $path -NoTypeInformation 
        #}      
       }     
     } 
} 

私はただのまわりで私の頭をラップすることはできません。私には2つの条件があります。 CSV用のフォルダはありますか?作成しない場合私は別のものを持っている必要があります。なぜなら、 "types"の中にフォルダを持っていないとエラーが出るので、自動的に作成しようとします。スクリプトを実行すると、パスはnullになります。

エラーは次のとおりです。

The term ' ' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At C:\Users\c.burkinshaw\foldermake.ps1:11 char:26 + | ` <<<< + CategoryInfo : ObjectNotFound: (:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

Test-Path : Cannot bind argument to parameter 'Path' because it is null. 
At C:\Users\c.burkinshaw\foldermake.ps1:12 char:45 
+       if(!(Test-Path -path <<<< $path2)) 
    + CategoryInfo   : InvalidData: (:) [Test-Path], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand 

あなたが尋ねることを躊躇しないでください質問がある場合は、すべてのヘルプは大幅にいただければ幸いです。

+0

パスはどこでヌルエラーですか。 – manojlds

+0

エラーに応じて:行11 Char 26または行12 Char 45 '$ path = $ _。name +" .csv "; $ _。group ' | ' – Anubis

答えて

0

はどこにも定義されていません。したがって、test-path -path $path2のようなものはpathがnullであると言います。そして1つの場所であなたは$._を使用しています。これは再びエラーを出します。

編集質問のエラーメッセージで更新した後:あなたがやろうとしているもの

$path=$_.name+".csv"; $_.group ` 
       | ` 

あなたのエラーメッセージも同じ

Test-Path : Cannot bind argument to parameter 'Path' because it is null. At C:\Users\c.burkinshaw\foldermake.ps1:12 char:45 + if(!(Test-Path -path <<<< $path2))

はまた、他のエラーがであると言いますここには$_.groupがありますか?

適切ではありません。 $_.group |を実行してif文を提供することはできません。

その他のコメント:

$_.basenameを使用して、.csvを追加しているのはなぜ?ちょうど$_.nameを使用している可能性があります。 select-object basenameを使用しないでください。値が表示されません。

一般的なimport-csvとexport-csvの部分を関数に抽出します。

+0

私は何か新しいことを試して、' $ path2'変数を削除するのを忘れました。 $ ._部分はデバッグしていた別の部分でした。作成した後にフォルダを削除していたので、正しく動作するようにすることができました。私は '$ _。basename'をCSVの名前のフォルダを作成するために選択しました。私はPowerShellの新機能なので、機能を試そうと思っていませんでした... – Anubis

+0

@Anubis - あなたの質問に完全にエラーを貼り付けてください。 – manojlds

+0

@Anubis - エラーから、if(!(Test-Path -path <<<< $ $$2)) 'にあり、' $ path2'が定義されていないことが明らかです! – manojlds

関連する問題