我对 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"