示例檔案名為 PO 2171 Cresco REVISED.pdf .....這些檔案很多,檔案名不標準,空格位置不固定。中間空格是大于128的字符ASCII碼,我想一次性用“_”替換大于128的字符ASCII碼。
我還沒學過Powershell。非常感謝你。
uj5u.com熱心網友回復:
為此,您將需要正則運算式。
下面我使用 ASCII 范圍 32 - 129(十六進制\x20-\x81)來替換任何控制字符:
(Get-ChildItem -Path 'X:\TheFolderWhereTheFilesAre' -File) |
Where-Object { $_.Name -match '[^\x20-\x81]' } |
Rename-Item -NewName { $_.Name -replace '[^\x20-\x81] ', '_' }
正則運算式詳細資訊:
[^\x20-\x81] Match a single character NOT in the range between ASCII character 0x20 (32 decimal) and ASCII character 0x81 (129 decimal)
Between one and unlimited times, as many times as possible, giving back as needed (greedy)
uj5u.com熱心網友回復:
Theo 的回答是有效的,但是有一個更簡單、更直接的解決方案,使用 .NET正則運算式 Unicode 代碼塊 \p{IsBasicLatin},它直接匹配任何 ASCII 范圍的Unicode字符(所有 .NET 字串都是 Unicode 字串,內部由UTF-16代碼單元組成) .
它的否定\P{IsBasicLatin}(注意大寫P)匹配ASCII 范圍之外_的任何字符,因此您可以在基于正則運算式的運算子的幫助下使用以下命令將所有非 ASCII 范圍字符替換為-replace:
(Get-ChildItem -File) | # Get all files in the current dir.
Rename-Item -NewName { $_.Name -replace '\P{IsBasicLatin', '_' } -WhatIf
注意:上面命令中的-WhatIf常用引數是預覽操作。-WhatIf 一旦您確定該操作將執行您想要的操作,請洗掉。
筆記:
將
Get-ChildItem呼叫包含在(...)可確保首先收集所有匹配的檔案,然后再執行重命名。這可以防止已經重命名的檔案重新進入檔案列舉時可能出現的問題。由于只需要重命名檔案(
-File),因此您不必擔心不包含非 ASCII 范圍字符的檔案名:Rename-Item悄悄地忽略將檔案重命名為已有名稱的嘗試。- 不幸的是,這不適用于目錄,這樣的嘗試會導致錯誤;從 PowerShell 7.2.4 開始出現的這種不幸的差異是GitHub 問題 #14903的主題。
嚴格來說,.NET 字符(
[char](System.Char) 實體)是 16 位Unicode代碼單元(UTF-16),在所謂的BMP(基本多語言平面)中只能單獨表示一個完整的 Unicode 字符,即在代碼-點范圍0x0-0xFFFF。超出該范圍的 Unicode 字符,尤其是 ?? 等表情符號,需要由兩個.NET[char]實體表示,即所謂的代理對。因此,上述解決方案將此類字符替換為兩個_字符,如以下示例所示:PS> 'A ??!' -replace '\P{IsBasicLatin}', '_' A __! # !! *two* '_' chars.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/479351.html
