【问题标题】:Powershell - Export Multiple CSV's into unique foldersPowershell - 将多个 CSV 导出到唯一的文件夹中
【发布时间】:2011-10-17 19:43:20
【问题描述】:

一两个星期的大部分时间里,我一直在编写 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 的文件夹?如果没有创建一个。我必须有另一个,因为其中一个“类型”包含一个 \,如果我没有文件夹,则会出错,所以我会自动尝试创建它。当我运行脚本时,我得到路径为空。

错误是:

术语“”未被识别为 cmdlet、函数的名称, 脚本文件或可运行的程序。检查名称的拼写,或 如果包含路径,请验证路径是否正确并重试。 在 C:\Users\c.burkinshaw\foldermake.ps1:11 char:26 + | `

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

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

【问题讨论】:

  • 你从哪里得到路径为空错误?
  • 根据报错:Line 11 Char 26 or Line 12 Char 45 $path=$_.name+".csv"; $_.group | `

标签: powershell csv


【解决方案1】:

你没有在任何地方定义$path2,所以像test-path -path $path2 这样的东西会说路径为空。在一个地方你使用$._ 会再次出错。

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

你的错误信息也这么说

Test-Path:无法将参数绑定到参数“Path”,因为它是 无效的。在 C:\Users\c.burkinshaw\foldermake.ps1:12 char:45 + if(!(Test-Path -path

另外一个错误在:

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

你想在这里用$_.group做什么?

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

其他cmets:

为什么使用$_.basename,然后附加.csv?你可以使用$_.name。尽量不要使用select-object basename - 我看不到值。

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

【讨论】:

  • 我尝试了一些新的东西,却忘了删除 $path2 变量。 $._ 部分是我正在调试的另一部分,我只是在创建文件夹后删除它们,这样我就可以尝试让一个部分正常工作。我选择了$_.basename,因为创建了带有 CSV 名称的文件夹。我对 PowerShell 很陌生,所以我什至没有想过要尝试功能......
  • @Anubis - 从错误中可以清楚地看出错误在if(!(Test-Path -path &lt;&lt;&lt;&lt; $path2)) 中,因为$path2 没有定义!
  • $_.group 用于将 CSV 项目分组到各自的集合中。我按类型(即列名)组织它们,然后这允许我为每种类型创建一个单独的 CSV。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多