Я полный новичок, когда дело доходит до 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"