Powershell копировать и переименовывать файлы
Я пытаюсь скопировать файлы из исходной папки в папку назначения и переименовать файлы в процессе.
$Source = "C:\Source"
$File01 = Get-ChildItem $Source | Where-Object {$_.name -like "File*"}
$Destination = "\\Server01\Destination"
Copy-Item "$Source\$File01" "$Destination\File01.test" -Force -
Confirm:$False -ErrorAction silentlyContinue
if(-not $?) {write-warning "Copy Failed"}
else {write-host "Successfully moved $Source\$File01 to
$Destination\File01.test"}
Проблема в том, что с Get-ChildItem
не выдает сообщение об ошибке, если файл не найден, а просто дает пустое место, в результате я получаю папку с именем File01.test
в месте назначения, если нет файла с именем File*
существует в $Source
,
Если он существует, операция копирования выполняется просто отлично. Но я не хочу, чтобы папка создавалась, если в $Source
Я просто хочу, чтобы сообщение об ошибке было зарегистрировано в файле журнала, и никакая файловая операция не произойдет.
2 ответа
Это не должно иметь значения, как называется файл, но оно не будет учитывать файлы, которые уже существуют в месте назначения. Так что если файл File01.txt уже существует и вы пытаетесь скопировать файл File01.txt снова, у вас будут проблемы.
param
(
$Source = "C:\Source",
$Destination = "\\Server01\Destination",
$Filter = "File*"
)
$Files = `
Get-ChildItem -Path $Source `
| Where-Object -Property Name -Like -Value $Filter
for ($i=0;$i -lt $Files.Count;$i++ )
{
$NewName = '{0}{1:D2}{3}' -f $Files[$i].BaseName,$i,$Files[$i].Extension
$NewPath = Join-Path -Path $Destination -ChildPath $NewName
try
{
Write-Host "Moving file from '$($Files[$i].FullName)' to '$NewPath'"
Copy-Item -Path $Files[$i] -Destination
}
catch
{
throw "Error moving file from '$($Files[$i].FullName)' to '$NewPath'"
}
}
Вы можете добавить оператор "if", чтобы код для копирования файлов работал только тогда, когда файл существует.
$Source = "C:\Source"
$Destination = "\\Server01\Destination"
$File01 = Get-ChildItem $Source | Where-Object {$_.name -like "File*"}
if ($File01) {
Copy-Item "$Source\$File01" "$Destination\File01.test" -Force -Confirm:$False -ErrorAction silentlyContinue
if(-not $?) {write-warning "Copy Failed"}
else {write-host "Successfully moved $Source\$File01 to
$Destination\File01.test"}
} else {
Write-Output "File did not exist in $source" | Out-File log.log
}
В блоке "if" он проверит, есть ли в $File01 что-либо, и если да, то он запустит следующий код. В блоке "else", если предыдущий код не был запущен, он отправит вывод в файл журнала "log.log".