在同一目錄中使用 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 :當該文件已存在時無法創建該文件。在 line:1 char:33 + (Get-ChildItem . ) | ForEach { 重命名-項目 - 路徑 $ .FullName -NewName " $ ( $ .Dir … + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (F:\abc\Test\Upl …00415-b-dbo:字元串)
$$ Rename-Item $$, IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
這以稍微不同的方式完成工作。通過將事情從管道中取出並使用正常循環,您可以獲得更直接的控制*,並*更清楚地看到每個步驟在做什麼。[咧嘴笑]
它能做什麼 …
- 設置常量$$ source dir & file name prefix $$
- 當您準備好對測試數據執行此操作時,會創建一些測試文件,只需刪除整個
#region/#endregion
塊。- 抓取文件中的
$SourceDir
- 遍歷這些文件
- 獲取後綴日期戳
- 建構新的文件名
- 建構完整的新文件名$$ includes the path $$
- 重命名文件
沒有輸出。“製作測試文件”區域中的錯誤被抑制,但您應該看到任何其他問題的錯誤消息。
測試文件相隔大約 2-15 毫秒。如果您的系統是快速 enuf,那麼您可能需要在該行
Start-Sleep
之前添加一個命令。$Suffix
也許像Start-Sleep -Milliseconds 10
.我還在
$Prefix
$Suffixto 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"