首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

PowerShell 批量重命名實戰:破解 Rename-Item 方括號 Bug 的 Move-Item 方案

     編輯:關於.NET

需求:批量重命名形如 [abcd]2008.01.01.測試.txt 的文件為 2008.01.01.txt (去除首尾括號內容)。Linux 下輕鬆搞定,Windows 下選擇 PowerShell 實踐,過程中踩中 Rename-Item 不支援方括號路徑的坑,最終用 Move-Item -LiteralPath 完美解決。

PowerShell 核心認知:一切皆對象

  • Cmdlet 輸出 .NET 對象 (非文本),《管道》傳遞豐富結構化數據。
  • dir (Get-ChildItem) 輸出 FileInfo/DirectoryInfo,可直接調用屬性方法。
  • Get-Member 探索對象結構:dir | Get-Member。
  • 常用別名:ls=dir=gci, ?=Where-Object, %=ForEach-Object,簡潔如 Perl/Awk。

遞進式探索示例

# 僅列出只讀文件
dir | ? { $_.IsReadOnly }

# 列出子目錄及文件數
ls | ? { $_.PSIsContainer } | % { "$($_.FullName): $($_.GetFiles().Length)" }

# 計算總文件數 (模擬 awk 模式)
ls | ? { $_.PSIsContainer } | % { $c=0 } { $c+=$_.GetFiles().Length } { "Total: $c" }

核心坑點:Rename-Item 方括號路徑失效

# 報錯:路徑不存在
Rename-Item 'F:/temp/[10]' 'F:/temp/10'
# 錯誤:Rename-Item : 指定路徑 F:/temp/[10] 下的對象不存在。

方括號在 PowerShell 路徑中屬通配符字符,轉義極其麻煩 (`[ `] 仍失效),這是已知 Bug。

終極方案:Move-Item -LiteralPath

Move-Item 的 -LiteralPath 參數完全禁用通配符解析,按字面路徑操作,完美繞過方括號問題。

# 最終一鍵重命名命令
ls *.avi | % {
    if ($_.FullName -match '(.*)/\[.*?\]/(\d{4}\.\d{2}\.\d{2}).*\.avi') {
        mv -LiteralPath $_.FullName "$($matches[1]$matches[2]).avi"
    }
}
  • -match 正則提取路徑前綴 ($matches[1]) 與日期 ($matches[2])。
  • mv 為 Move-Item 別名,-LiteralPath 確保源路徑字面解析。
  • 目標路徑組合為「前綴+日期.avi」,實現精準重命名。

實踐出真知,遇 Bug 更長見識。PowerShell 物件管道 + 正則 + LiteralPath,讓 Windows 批量文件操作同樣優雅高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved