2011-10-17 2 views
0

저는 1 주일이나 2 주일의 더 나은 부분을 위해 PowerShell 스크립트를 작성했습니다. 나는 그것의 일부를 작동시킬 수 있었지만 나는 이것을 완전히 자동화 할 수 없었다.Powershell - 여러 개의 CSV를 고유 한 폴더로 내보내기

나는 매일 CSV 파일을 많이 처리하지만 소프트웨어에 파일을 업로드하는 작업을 맡았지만 때로는 처리하기에는 너무 커서 처리하기에 "유형"(즉, 열을 CSV로 가져오고 "유형"당 하나의 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 
        #}      
       }     
     } 
} 

난 그냥 주위에 내 머리를 정리하고 수 없습니다. 두 조건이 있습니다. CSV 용 폴더가 있습니까? 생성하지 않을 경우. "유형"중 하나에 폴더가없는 경우 오류가 발생하여 자동으로 폴더를 만들려고하기 때문에 다른 폴더가 있어야합니다. 스크립트를 실행하면 경로가 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

어디에서 경로가 null 오류입니까? – manojlds

+0

오류에 따라 : 줄 11 Char 26 또는 줄 12 Char 45 '$ 경로 = $ _. 이름 + ".csv"; $ _. 그룹' | ' – Anubis

답변

0

어디서나 $path2을 정의하지 않았으므로 test-path -path $path2과 같이 경로가 null입니다. 그리고 한 곳에서 다시 오류를주는 $._을 사용하고 있습니다.

편집 오류 메시지와 함께 업데이트 된 질문 후 :

귀하의 오류 메시지는 말한다

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))

은 또 다른 오류에 같은 : 당신이 뭘 하려는지

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

여기 $_.group?

적합하지 않습니다. $_.group |을 수행하고 if 문을 제공 할 수 없습니다.

기타 의견 :

$_.basename를 사용하고 .csv을 추가? 방금 $_.name을 사용할 수 있습니다. select-object basename을 사용하지 마십시오. 값이 표시되지 않습니다.

일반적인 import-csv 및 export-csv 부분을 함수로 추출합니다.

+0

새로운 것을 시도해보고'$ path2' 변수를 삭제하는 것을 잊었습니다. $ ._ 부분은 내가 디버깅하는 또 다른 부분이었습니다. 폴더가 만들어지면 폴더를 삭제하기 만하면 제대로 작동 할 수있었습니다. CSV의 이름을 가진 폴더를 만들기 때문에'$ _. basename'을 선택했습니다. PowerShell을 처음 접했을 때 기능을 시도해 보지도 않았습니다 ... – Anubis

+0

@Anubis - 질문에 오류를 완전히 붙여 넣으십시오. – manojlds

+0

@Anubis - 오류로부터'if (! (Test-Path -path <<<< $ $$2))'와'$ path2'가 정의되지 않았기 때문에 오류가 명확하게 나타납니다! – manojlds

관련 문제