В основном моя цель - скопировать содержимое папки в другую папку с исключением одного имени, а также зарегистрировать все, что было скопировано.
Я готов к регистрации команды Get-ChildItem в сочетании с Pipeline -> Copy-Item
Следующая команда поместит в файл журнала все данные из команды Get-ChildItem:
$SourcePath = "D:\TEST"
$DestPath = "C:\TEST"
$LogDetailFile = "C:\Temp\CopyDetail.log"
$Exclude = "!_Archive_!"
Get-ChildItem $SourcePath -Recurse | Where {$_.FullName -notmatch $Exclude} |
Select FullName | Add-Content $LogDetailFile
Когда я дополнительно добавляю следующую команду Pipeline, чтобы скопировать их в $DestPath, это не сработает:
Get-ChildItem $SourcePath -Recurse | Where {$_.FullName -notmatch $Exclude} |
Copy-Item -Destination {Join-Path $DestPath $_.FullName.Substring($SourcePath.length)} |
Add-Content $LogFile
Когда я сделал это без параметров ведения журнала, то все работает нормально, и данные копируются целиком:
Get-ChildItem $SourcePath -Recurse | Where {$_.FullName -notmatch $Exclude} |
Copy-Item -Destination {Join-Path $DestPath $_.FullName.Substring($SourcePath.length)}
Я уже пробовал переключать конвейеры между ними, но это не работает. Что мне здесь не хватает? Как скопировать все из одной папки в другую и записать все скопированные элементы в файл журнала?
Прямо сейчас, если я хочу иметь 2 вещи - ведение журнала и копирование этих элементов, мне нужно запустить 2 команды, просто хочу, чтобы это было в одной команде.
ForEach-Object
может помочь вам здесь, причина, по которой оба разрыва объединяются, заключается в том, что ни один из этих командлетов (Add-Content
и Copy-Item
) не производит вывод, поэтому не к чему передавать.
$SourcePath = 'D:\TEST'
$DestPath = 'C:\TEST'
$LogDetailFile = 'C:\Temp\CopyDetail.log'
$Exclude = '!_Archive_!'
Get-ChildItem $SourcePath -Recurse | ForEach-Object {
if ($_.FullName -notmatch $Exclude) {
$_ | Copy-Item -Destination { Join-Path $DestPath $_.FullName.Substring($SourcePath.Length) }
$_ | Select-Object FullName # Probably need `-ExpandProperty` here
}
} | Add-Content $LogDetailFile
Спасибо за быстрый ответ :) Это спасло мой мозг от взрыва ;) Теперь скопируйте его и зарегистрируйте. Прохладный!
Оставил это вне ответа, но я считаю, что вы должны использовать
Select-Object -Expand FullName
, иначе без расширения вы получите строковое представление таких объектов, как@{FullName=.....}