Powershell

在同一目錄中使用 PowerShell 修改多個文件名

  • April 28, 2020

當談到 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$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"

引用自:https://serverfault.com/questions/1014475