Powershell - 将多个CSV导出到唯一的文件夹中

时间:2011-10-17 19:43:20

标签: powershell csv

我已经为一周或两周的好一部分工作了一个PowerShell脚本。我已经能够使它的一些部分工作,但是我无法完全实现这一点。

我每天处理很多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文件夹?如果没有创建一个。我必须有另一个,因为其中一个“类型”包含一个\如果我没有该文件夹会出错,所以我会自动尝试创建它。当我运行脚本时,我得到Path为null。

错误是:

  

术语''不被识别为cmdlet的名称,函数,   脚本文件或可操作程序。检查名称的拼写,或   如果包含路径,请验证路径是否正确,然后重试。       在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

任何帮助将不胜感激,如果您有任何疑问,请不要犹豫。

1 个答案:

答案 0 :(得分:0)

您尚未在任何地方定义$path2,因此test-path -path $path2之类的内容会将路径视为空。在一个地方,您使用$._,这将再次出错。

使用错误消息更新问题后编辑:

您的错误消息也说明了相同的

  

Test-Path:无法将参数绑定到参数'Path',因为它是   空值。在C:\ Users \ c.burkinshaw \ foldermake.ps1:12 char:45   + if(!(Test-Path -path&lt;&lt;&lt;&lt;&lt; $ path2))

另一个错误是:

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

你想用$_.group做什么?

这是不恰当的。你不能做$_.group |并提供一些if语句。

其他评论:

为什么使用$_.basename然后追加.csv?您可以刚刚使用$_.name。尽量不要使用select-object basename - 我没有看到价值。

将常用的import-csv和export-csv部分提取到函数中。