Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need help with simple powershell command copy using foreach

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
like image 219
Dave Avatar asked Dec 12 '22 12:12

Dave


2 Answers

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'
    }
}
like image 82
Bacon Bits Avatar answered Feb 24 '23 10:02

Bacon Bits


Just a note: you don't need to nest for-eachs (@Bacon) or use parenthesis (@JPBlanc), just use

Get-Content d:\test\file.txt |
  Foreach-Object {$_ -split ';'} |
  Copy-Item -dest d:\test\xx

Also note that you use relative paths to files, which might bite you.

like image 35
stej Avatar answered Feb 24 '23 10:02

stej