Need help with simple powershell command copy using foreach

Dave picture Dave · Jun 22, 2011 · Viewed 10.1k times · Source

I'm new to powershell and this question will prove that point. I'm trying a simple task from the command line where I have a txt file containing filenames separated by semicolons like...

fnameA.ext;fnameB.ext;fnameC.ext;....

I'm trying to run a command which will parse this file, split the contents by semicolon, and then run a copy command for each file to a desired directory.

Here is the command I'm running:

gc myfile.txt |% {$_.split(";") | copy $_ "C:\my\desired\directory"}

But I'm getting an error like this for each item in the list...

Copy-Item : The input object cannot be bound to any parameters for the command either because the command does not take
 pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
At line:1 char:36
+ gc bla.txt |% {$_.split(";") | copy <<<<  $_ "C:\my\desired\directory"}
    + CategoryInfo          : InvalidArgument: (fileA.txt:String) [Copy-Item], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemCommand

Answer

Bacon Bits picture Bacon Bits · Jun 22, 2011

Resist the urge to make one-liners, especially when you're starting out. That said, the problem is you need to pipe the split content to another ForEach-Object.

Try this:

$File = Get-Content .\MyFile.txt
$File | ForEach-Object {
    $_.Split(';') | ForEach-Object {
        Copy-Item -Path "$_" -Destination 'C:\destination'
    }
}