Нужна помощь с простым копированием команды powershell с использованием foreach - PullRequest
3 голосов
/ 22 июня 2011

Я новичок в powershell, и этот вопрос докажет этот момент.Я пытаюсь выполнить простую задачу из командной строки, где у меня есть текстовый файл, содержащий имена файлов, разделенные точками с запятой, такие как ...

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

Я пытаюсь запустить команду, которая будет анализировать этот файл, разделитьсодержимое через точку с запятой, а затем выполните команду копирования для каждого файла в нужный каталог.

Вот команда, которую я выполняю:

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

НоЯ получаю такую ​​ошибку для каждого элемента в списке ...

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

Ответы [ 4 ]

8 голосов
/ 22 июня 2011

Не поддавайтесь желанию сделать одну строчку, особенно когда вы начинаете. Тем не менее, проблема в том, что вам нужно передать разделенный контент другому ForEach-Object.

Попробуйте это:

$File = Get-Content .\MyFile.txt
$File | ForEach-Object {
    $_.Split(';') | ForEach-Object {
        Copy-Item -Path "$_" -Destination 'C:\destination'
    }
}
2 голосов
/ 22 июня 2011

Просто примечание: вам не нужно вкладывать для каждого (@Bacon) или использовать скобки (@JPBlanc), просто используйте

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

Также обратите внимание, что вы используете относительные пути к файламкоторый может укусить вас.

1 голос
/ 22 июня 2011

Совет @Bacon очень полезен, если вы начинаете с того, что вам нужно обнаружить, что Powershell CmdLets выводит объект или список объектов и что вы можете использовать свойства и методы для этих объектов.

Вот более короткий путь (для развлечения):

(${c:\temp\myfile.txt }).split(';') | % {cp $_ C:\my\desired\directory}
0 голосов
/ 22 июня 2011
(Get-Content myfile.txt) -Split ';' | Copy-Item -Destination C:\my\desired\directory
...