2009-12-14 4 views
4

Я новичок в PowerShell, и мне бы очень хотелось, чтобы это можно было скриптировать. У меня есть текстовый файл, где каждая строка является частью имени файла без пути или расширения. Я хотел бы, чтобы однострочный контур, проходящий через каждую строку файла (с gc - Get-Content, справа?), Принимает содержимое строки, конструирует исходный путь (сетевой диск и расширение являются статическими), создает путь назначения, а затем копирует каждый файл. Мое содержимое файла, как это:PowerShell: прочитайте строки из текстового файла, создайте имена файлов источника и целевого файла, затем скопируйте файлы

12345678 
98765432 
32145698 
12365782 

И моя исходная папка является UNC путь:

\\server\share 

И моя папка назначения:

c:\temp\files 

Я хотел бы сделать эквивалент этой команды DOS, используя $_ в качестве текста из каждой строки файла:

copy \\server\share\$_.ext c:\temp\files\$_.ext 

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

ответ

5

Попробуйте следующее

gc theFileName | 
    %{ "{0}.ext" -f $_ } | 
    %{ copy "\\server\share\$_" "c:\temp\files\$_" } 

Это действительно может быть сделано на одной линии, но он выглядит лучше formmated в несколько строк для этого ответа :)

+0

Отлично. Огромное спасибо! @ JaredPar, мой личный тренер Powershell. –

+1

что-то не так с 'gc theFileName | % {cp '\\ server \ share \ $ _. ext' 'C: \ temp \ files'} '? Или это коротко? :-) – Joey

+0

@Johannes, я думаю, что это сработает, но я забыл о правилах синтаксического анализа при замене внутри строки изредка и не был уверен, правильно ли интерпретируется .ext. Отсюда пошел безопасный маршрут – JaredPar

4

Copy-Item может принимать блок скрипта непосредственно в этом дело так этапов Foreach-Object излишни:

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif 

Удалить параметр -WhatIf как только вы удовлетворены это работает. Значение -l не подходит для -LiteralPath, который помогает PowerShell определить, какой набор параметров используется. Также лучше использовать литеральный путь здесь, чтобы подстановочные символы не попадали в globbed (если вы этого не хотите - если так, то используйте -path).

По сути, связанные с конвейером параметры могут быть заданы с помощью сценариев, а PowerShell попытается разрешить результат скриптового блока для типа, ожидаемого параметром связанного с конвейером.

+0

Действительно ли это в целом или отличная функция Copy-Item? –

+1

Это работает для любого параметра, который также связан конвейером. Параметр/связующий параметр параметра PowerShell будет анализировать блок сценария для связанных параметров конвейера, если, конечно, тип параметра [scriptblock]. –

+0

Действительно, он даже работает с параметрами ValueFromPipelineByPropertyName - удивительный! –

Смежные вопросы