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".

Другие вопросы по тегам