Назад | Перейти на главную страницу

Измените несколько имен файлов с помощью PowerShell в одном каталоге

Я полный новичок, когда дело доходит до PowerShell, но я боролся с этим весь день и не знаю, почему.

Каждый день у меня будет набор файлов в каталоге. У файлов будут разные имена и разные расширения, поэтому все они будут уникальными. Я пытаюсь переименовать все эти файлы, чтобы они содержали одно и то же исходное имя файла, а затем поместили текущую дату и время в конце и не включали расширение. Ниже то, что у меня есть. Я просматриваю каталог, в котором находятся мои файлы, создаю свою переменную для получения текущей даты и времени и форматирую так, как я хочу. Затем я запускаю свою команду для переименования, и она всегда выдает ошибку после успешного выполнения первого файла, поскольку он пытается снова отредактировать первый файл, который уже был переименован. Любая помощь будет принята с благодарностью. Заранее спасибо.

Примеры имен файлов для переименования

test123.dat
341test.txt
983asdf.doc

Желаемый конечный результат, при котором каждый файл уникален с точностью до миллисекунды, которую вы можете увидеть как конечные 4 числа в имени файла ниже:

abcabcp123456789d202004271552001023
abcabcp123456789d202004271552001024
abcabcp123456789d202004271552001025

Что пробовал:

$curDateTime = Get-Date -Format yyyyMMddTHHmmssffff
Get-ChildItem *.* | Rename-Item -NewName {'abcabcp123456789d' + $curDateTime}

Если я запускаю -WhatIf, он говорит, что работает нормально, без ошибок. Когда я действительно запускаю его, он говорит: Rename-Item: Невозможно создать файл, если этот файл уже существует.

Это слишком быстро даже для миллисекунд? В -WhatIf, даже если он говорит, что ошибок нет, все три файла отображаются с одинаковым именем. В любом случае. Еще раз спасибо.

Обновленный вариант, который я пробовал запустить:

Get-ChildItem *.* | ForEach { 
    Rename-Item -Path $_.FullName -NewName "$($_.DirectoryName)\$('abcabcp123456789d')$(Get-Date -F yyyyMMddTHHmmssffff)" 
}

Пробовал код с круглыми скобками:

(Get-ChildItem *.*) | ForEach { Rename-Item -Path $_.FullName -NewName "$($_.DirectoryName)\$('abcabcp123456789d')$(Get-Date -F yyyyMMddTHHmmssffff)"}

Новый код со скобками, который не работал. Я получил ошибку:

Rename-Item: невозможно создать файл, если он уже существует. В строке: 1 символ: 33 + (Get-ChildItem .) | ForEach {Rename-Item -Path $.FullName -NewName "$ ($.Dir ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: WriteError: (F: \ abc \ Test \ Upl ... 00415-b-dbo: String) [Rename-Item], IOException + FullyQualifiedErrorId: RenameItemIOError, Microsoft.PowerShell.Commands.RenameItemCommand

это работает немного иначе. вынимая вещи из конвейера и используя обычный цикл, вы можете получить немного более прямой контроль и более четко увидеть, что делает каждый шаг. [ухмылка]

что оно делает ...

  • устанавливает константы [исходный каталог и префикс имени файла]
  • создает несколько тестовых файлов
    когда вы будете готовы сделать это с вашими тестовыми данными, просто удалите все #region/#endregion блок.
  • захватывает файлы в $SourceDir
  • перебирает эти файлы
  • получает отметку даты суффикса
  • строит новое имя файла
  • строит ПОЛНОЕ новое имя файла [включает путь]
  • переименовывает файл

нет выходов. ошибки подавляются в области «make test files», но вы должны видеть сообщения об ошибках для любых других проблем.

тестовые файлы находятся примерно в 2-15 миллисекундах. если ваша система работает быстро enuf, вам может потребоваться добавить Start-Sleep команда непосредственно перед $Suffix линия. возможно что-то вроде Start-Sleep -Milliseconds 10.

я также добавил подчеркивание между $Prefix и суффикс $to make it easier for me to read. you can remove that by changing the-присоединиться '_'to-соединиться ''.

код ...

$SourceDir = "$env:TEMP\TestingStuff"
$Prefix = 'abcabcp123456789d'

#region >>> create test files to work with
#    when ready to do test with real data, remove this entire block
$Null = mkdir -Path $SourceDir -ErrorAction 'SilentlyContinue'
@('test123.dat'
    '341test.txt'
    '983asdf.doc'
    ) |
    ForEach-Object {
        $Null = New-Item -Path $SourceDir -Name $_ -ItemType 'File' -ErrorAction 'SilentlyContinue'
        }
#endregion >>> create test files to work with

$FileList = Get-ChildItem -LiteralPath $SourceDir -File

foreach ($FL_Item in $FileList)
    {
    $Suffix = (Get-Date).ToString('yyyyMMddTHHmmssfff')
    $NewName = $Prefix, $Suffix -join '_'
    $FullNewName = Join-Path -Path $SourceDir -ChildPath $NewName

    Rename-Item -LiteralPath $FL_Item.FullName -NewName $FullNewName
    }

переименованные файлы ...

"C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747124"
"C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747126"
"C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747117"