2014-09-12 2 views
11

Я пытаюсь скопировать все файлы *.csproj.user с рекурсивно из C:\Code\Trunk в C:\Code\F2.Рекурсивно копировать набор файлов из одной директории в другую в PowerShell

Например:

C:\Code\Trunk\SomeProject\Blah\Blah.csproj.user

бы скопирована в:

C:\Code\F2\SomeProject\Blah\Blah.csproj.user

Моя нынешняя попытка является:

Copy-Item C: \ Code \ Магистральные -Filter * .csproj.user -Определение C: \ Code \ F2 -Recurse -WhatIf

Однако я получаю:

Что делать, если: Выполнение операции "Копировать Справочник" на Target «Предмет: C: \ Code \ Ствол Назначение: C : \ Code \ F2 \ Trunk».

Во-первых, он хочет поместить их все в новую папку под названием F2\Trunk, что является неправильным. Во-вторых, он не перечисляет ни один из файлов. Должно быть скопировано около 10 файлов.

Какой правильный синтаксис для команды? Благодаря!

Update:

Хорошо, это, кажется, что-то делать с тем фактом, что C:\Code\F2 уже существует. Если я попытаюсь скопировать файлы в пункт назначения, который делает не, он работает.

Я хочу, чтобы переписать любых существующих .csproj.user файлов в пункт назначения.

+0

Часть о его создании новой папки есть ошибка, которая была документированной [здесь] (https://connect.microsoft.com/PowerShell/feedback/details/809855/subfolder-bug-with-command -копия-пункт-с-папка-с-folder2-рекурсия-когда сделал-более раз). –

ответ

2

Видел это раньше, и я не знаю, почему PowerShell не может показаться правильным (IMHO). То, что я сделаю, более громоздко, но оно работает.

+0

Я думаю, что вы можете удалить всю вещь регулярных выражений, если вы используете параметр '-LiteralPath' для команды' Copy-Item' – bitbonk

0

Ответ 1 выглядел хорошо, и я изменил на Move-Item для моих целей. Однако я обнаружил, что в каждой папке он рекурсивно прошел, он только переместил первый файл. Ниже мой полный сценарий, который также включает в себя некоторые преобразования DOC файлов в PDF-:

$Source = 'C:\Users\sgrody\Desktop\NSPM-Vol1' 
$MoveFiles = '*.PDF' 
$Dest = 'C:\Users\sgrody\Desktop\MedPassPDF' 
$Folders = Get-ChildItem $Source -Directory -Recurse 


ForEach ($Folder in $Folders) 
{ 
    $wdFormatPDF = 17 
    $word = New-Object -ComObject word.application 
    $word.visible = $false 
    $folderpath = "$($Folder.FullName)\*" 
    $fileTypes = "*.docx","*doc" 
    Get-ChildItem -path $folderpath -include $fileTypes | 
    foreach-object 
    { 
    $path = ($_.fullname).substring(0,($_.FullName).lastindexOf(".")) 
    "Converting $path to pdf ..." 
    $doc = $word.documents.open($_.fullname) 
    $doc.saveas([ref] $path, [ref]$wdFormatPDF) 
    $doc.close() 
    } 
    $word.Quit() 
} 

Get-ChildItem $Source -Filter $MoveFiles -Recurse | ForEach{ 
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest 
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null 
    Move-Item $_.FullName -Destination $Path -Force 
    } 
} 
15

Вы, ребята, делаете это чудовищно сложно, когда это действительно просто:

Copy-Item C:\Code\Trunk -Filter *.csproj.user -Destination C:\Code\F2 -Recurse 

скопирует каталог, создание каталога «Trunk» в F2.Если вы хотите, чтобы избежать создания папки Ствол верхнего уровня, вы должны прекратить говорить PowerShell, чтобы скопировать его:

Get-ChildItem C:\Code\Trunk | Copy -Destination C:\Code\F2 -Recurse -filter *.csproj.user 
+0

Первая команда работала и НЕ создавала 'Trunk'. – CodeMed

+0

Никто бы не мечтал, что первым способом было «сказать» его, чтобы скопировать папку, поскольку «копировать» является псевдонимом «копировать элемент», а «копировать» в DOS не получилось, если я Не ошибаюсь. Отсюда возникла путаница и усложнение. – as9876

1

Хотя наиболее проголосовали ответ совершенно справедливо для отдельных типов файлов, если вам нужно скопировать несколько файлов типов существует более полезная функциональность называется Robocopy именно для этой цели с использованием простого

robocopy C:\Code\Trunk C:\Code\F2 *.cs *.xaml *.csproj *.appxmanifest /s 
0

Я попытался Jaykul ответа, и он не работает для меня. Мне пришлось изменить его, как показано ниже, чтобы заставить его работать. Я также создал папку C: \ Code \ F2, прежде чем она сработает.

Get-ChildItem C:\Code\Trunk Recurse -filter *.csproj.user | Copy -Destination C:\Code\F2 
Смежные вопросы