Powershell - экспорт нескольких CSV-файлов в уникальные папки - PullRequest
0 голосов
/ 17 октября 2011

Я работал над сценарием 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?Если нет, создайте его.У меня должен быть другой, потому что один из «типов» содержит \ какие ошибки, если у меня нет папки, поэтому я автоматически пытаюсь создать ее.Когда я запускаю скрипт, я получаю нулевой путь.

Ошибка:

Термин '' не распознается как имя командлета, функции, файла скрипта,или работоспособная программа.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.В C: \ Users \ c.burkinshaw \ foldermake.ps1: 11 char: 26 + |`<<<< + CategoryInfo: ObjectNotFound: (: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException </p>

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 голосов
/ 17 октября 2011

Вы нигде не определили $path2, поэтому что-то вроде test-path -path $path2 скажет, что путь равен нулю.И в одном месте вы используете $._, который снова выдаст ошибки.

Правка после вопроса, обновленная с сообщением об ошибке:

Ваше сообщение об ошибке также говорит то же самое

Test-Path: Невозможно привязать аргумент к параметру «Path», поскольку он имеет значение null.В C: \ Users \ c.burkinshaw \ foldermake.ps1: 12 char: 45 + if (! (Test-Path -path <<<< $ path2)) </p>

Также другая ошибкав:

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

что вы пытаетесь сделать здесь с $_.group?

Это неправильно.Вы не можете сделать $_.group | и предоставить несколько операторов if.

Другие комментарии:

Почему вы используете $_.basename, а затем добавляете .csv?Вы могли бы просто использовать $_.name.Старайтесь не использовать select-object basename - я не вижу значения.

Извлеките общие части import-csv и export-csv в функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...