使用 PowerShell 修改同一目录中的多个文件名

使用 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 { 重命名项目 -路径 $.全名-新名称“$($.Dir ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (F:\abc\Test\Upl...00415-b-dbo:String) [Rename-Item],IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

答案1

这以稍微不同的方式完成工作。通过从管道中取出内容并使用正常循环,您可以获得更直接的控制更清楚地了解每个步骤的作用。[咧嘴笑]

它能做什么 ...

  • 设置常量 [源目录和文件名前缀]
  • 创建一些测试文件
    当您准备使用测试数据执行此操作时,只需删除整个#region/#endregion块。
  • 抓取文件$SourceDir
  • 遍历这些文件
  • 获取后缀日期戳
  • 创建新的文件名
  • 建立完整的新文件名[包括路径]
  • 重命名文件

没有输出。错误被抑制在“制作测试文件”区域中,但您应该会看到任何其他问题的错误消息。

测试文件大约相隔 2-15 毫秒。如果您的系统足够快,那么您可能需要Start-Sleep在该行之前添加一个命令$Suffix。也许是类似于Start-Sleep -Milliseconds 10

$Prefix我还在和 $Suffix to make it easier for me to read. you can remove that by changing the-join '_' to-join ''` 之间添加了下划线。

代码 ...

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

相关内容