0
votes

I have been working on a PowerShell script for the better part of well a week or two. I've been able to get some parts of it working however I'm unable to fully get this automated.

I deal with a lot of CSV files on a daily basis, I have been tasked with uploading them into our software however sometimes they're too large to handle so I break them down based upon their "type" (it's a column in the CSV) and I export it to a single CSV per "type". I've been able to accomplish this with the following:

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

So this works wonderfully, for each individual CSV. Unfortunately I don't have the time to do this for each individual CSV. Now I come to my other PowerShell script:

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
                    #}                    
                }                
        }
}

I just can't wrap my head around "why" this isn't working effectively. I have two conditionals. Is there a folder for the CSV? If no create one. I have to have another one because one of the "types" contains a \ which errors out if I don't have the folder, so I automatically try to create it. When I run the script I get the Path is null.

The Error is:

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

Any help would be greatly appreciated, if you have questions please don't hesitate to ask.

1
Where do you get the path is null error? - manojlds
According to the error: Line 11 Char 26 or Line 12 Char 45 $path=$_.name+".csv"; $_.group | ` - Anubis

1 Answers

0
votes

You have not defined $path2 anywhere, so something like test-path -path $path2 will say path is null. And in one place you are using $._ which will again give errors.

Edit after question updated with error message:

Your error message also says the same

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

Also the other error is in:

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

what are you trying to do here with the $_.group?

It is not proper. You cannot do $_.group | and provide some if statement.

Other comments:

Why are using $_.basename and then appending .csv? You could have just used $_.name. Try to not use the select-object basename - I don't see the value.

Extract the common import-csv and export-csv part into a function.