Вот сценарий: у нас есть рабочий веб-сервер с несколькими тысячами файлов и папок, к которым прикреплена «_DATE». Мы хотим переместить их во временную папку (убедитесь, что они не используются), а затем удалите файлы.
Я могу использовать:
Get-ChildItem -Path W:\IIS -Recurse | Where-Object{$_.Name -match "_\d{8,10}$"}
Чтобы получить список всех файлов / папок и их расположения. Но удаление их всех вручную кажется большой работой, особенно если это потребуется в будущем. Я нашел несколько примеров, которые почти делают то, что я хочу:
cls
$source = "W:\IIS"
$destination = "C:\Temp\DevTest"
foreach ($i in Get-ChildItem -Path $source -Recurse)
{
if ($i.Name -match "_\d{8,10}$")
{
Copy-Item -Path $i.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Trim($item.Name)
}
}
И
cls
$source = "W:\IIS"
$destination = "C:\Temp\DevTest"
$bin = Get-ChildItem -Path $source -Recurse | Where-Object{$_.Name -match "_\d{8,10}$"}
foreach ($item in $bin) {
Copy-Item -Path $item.FullName -Container -Destination $item.FullName.ToString().Replace($source,$destination).Trim($item.Name) -Recurse
}
Проблема с этими двумя заключается в том, что когда я тестирую их с помощью просто copy-item, я получаю плоский каталог, и мне нужно сохранить структуру каталогов, чтобы в случае неправильного перемещения я мог вернуться (предпочтительно перетаскиванием и сбросив все папки обратно в папку IIS), или я получаю копию множества дополнительных папок / файлов, которые не отображаются при запуске первой команды.
Изменение моей первой команды на:
Get-ChildItem -Path W:\IIS -Recurse | Where-Object{$_.Name -match "_\d{8,10}$"} | Copy-Item -Container -Destination C:\Temp\DevTest -Recurse
Скопирует все, что мне нужно, но с плоским деревом каталогов, вместо сохранения древовидной структуры (но с заменой исходного каталога на место назначения).
Есть предложения / комментарии?