2016-11-10 13 views
0

Так что я танцевал с этим в течение дня и в течение дня, и вечная фраза «Есть несколько способов кошки кошки» постоянно приходит в голову, поэтому я решили взять в сообщество.PowerShell для копирования файлов во вложенные папки получателя, за исключением определенных папок в пункте назначения

Сценарий:

папка Источник "C: \ Updates" имеет 100 файлов различных расширений. Все необходимо скопировать в только вложенные папки из «C: \ Prod \» перезапись любых дубликатов, которые могут быть найдены.

предостережений:

  1. Название суб-папки (назначения) в "C: \ Prod" весьма динамичны и часто меняются.

  2. Соглашение об именах используется для определения того, какие подпапки в месте назначения должны быть исключены при копировании исходных файлов (чтобы сохранить исходные версии). Для удобства объяснения можно сказать, что любые имена папок, начинающиеся с «! Stop», должны быть исключены из процесса копирования. (! * Остановить, если подстановочные считать)

Итак, здесь я хотел вход тех, больше, чем я, чтобы решать это в PS, если мне повезет. Сегодня я возился с Copy-Item и xcopy, поэтому я очень рад услышать вход других.

Спасибо!

-Крис

ответ

1

Дайте этому выстрел:

Get-ChildItem -Path C:\Prod -Exclude !stop* -Directory ` 
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force } 

Это захватывает каждую папку (переключатель -Directory обеспечивает мы только захватить папки) в C: \ Prod, который не соответствует фильтру и трубы к команде ForEach-Object, где мы запускаем команду Copy-Item, чтобы скопировать файлы в каталог.

Коммутатор -Directory не доступен в каждой версии PowerShell; Я не знаю, какая версия была введена с моей головы. Если у вас есть старая версия PowerShell, которая не поддерживает -Directory, то вы можете использовать этот скрипт: «Стоп!»

Get-ChildItem -Path C:\Prod -Exclude !stop* ` 
| Where-Object { $_.PSIsContainer } ` 
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force } 
+0

@CharlieEcho Обновлено. Теперь он должен работать. –

+0

Это получилось!Я понятия не имел о переключателе -Destination и, конечно же, открыл ISE на своей Windows 10 VM и BOOM там. Большое спасибо за ваш вклад. –

+0

Из [Get-ChildItem for FileSystem] (https://docs.microsoft.com/powershell/module/microsoft.powershell.core/providers/filesystem-provider/get-childitem-for-filesystem#notes): «Атрибуты , Directory, File, Hidden, ReadOnly и System были введены в Windows PowerShell 3.0 и эффективны только для дисков файловой системы ». – BACON

0

Чтобы выбрать только вложенные папки, которые не начинаются с делать это

$Source = "C:\Updates\*" 
$Dest = "C:\Prod" 
$Stop = "^!stop" 

$Destinations = GCI -Path $Dest |?{$_.PSIsContainer -and $_.Name -notmatch $Stop } 
ForEach ($Destination in $Destinations) { 
    Copy-Item -Path $Source -Destination $Destination.FullName -Force 
} 

Отредактировано Теперь копирует все файлы из «Обновить» на «Субтитры источника», а не начиная с «! Stop». Переключатель -whatif показывает, что произойдет, чтобы переместить скрипт в положение -whatif.

Редактировать2 Упрощенный сценарий. Если также Sub/sub-folders of C: \ Prod должны получить копии, включите опцию -rec в gci прямо перед ним.

+0

Hi LotPings, ваши 1-й 2 строки кода работают, как и ожидалось, но ваш последний ** ForEach ($ Destination in $ Destionations) {«do copy/compare»} ** оставляет меня немного потерянным. Я высоко ценю ваш вклад и хотел бы попросить вас пересмотреть это, чтобы я мог отдать вам должное за публикацию! –

+0

Они предназначены только для хранения кода, поставляемого вами. В этом аспекте ваш сценарий немного неясен. Файлы копируются только в том случае, если существует более старая версия или все файлы. И предложение в круглых скобках само по себе является противоречием. Поэтому я решил сосредоточиться на основной части. – LotPings

+0

@CharlieEcho Редактировать ответ, чтобы скопировать все файлы – LotPings