[問題] 批次修改,保留舊檔名並新增編號

看板Windows作者 (傑克葡萄)時間1天前 (2024/10/19 15:29), 20小時前編輯推噓3(3034)
留言37則, 3人參與, 6小時前最新討論串1/1
公司電腦有鎖軟體,無法用改名軟體 因為文件上傳有檔名格式要求 小弟的需求是本來檔名前8碼編號保留,後面新增底線與編號。 上網找了一下文章,PoweShell指令自己嘗試更改有稍微完成,但遇到困擾是檔名保留了 ,但編號沒辦法因為不同檔名重新編號…. 以下是改完後的,求大神出手 Get-ChildItem *.pdf | ForEach-Object -Begin { $count = 1 } -Process { Rename-Item $_ -NewName ($_.Name.Substring(0,8)+"_$count.pdf" -f $c++) $count++ } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.8.38.198 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Windows/M.1729322975.A.C43.html

10/19 17:16, 1天前 , 1F
在字串中必須要用$()包含程式碼,用來與一般字串區別,
10/19 17:16, 1F

10/19 17:16, 1天前 , 2F
所以是"_$($count).pdf"。另外,為何會有 -f $c++?這看起
10/19 17:16, 2F

10/19 17:16, 1天前 , 3F
來是多餘的,沒有任何可以代入的地方。
10/19 17:16, 3F

10/19 17:19, 1天前 , 4F
順便一提,不要把副檔名寫死比較好,如果會混合檔案格式
10/19 17:19, 4F

10/19 18:01, 1天前 , 5F
這種問題直接問copilot
10/19 18:01, 5F

10/19 18:05, 1天前 , 6F
Get-ChildItem -LiteralPath . -Filter *.pdf | ForEach-O
10/19 18:05, 6F

10/19 18:05, 1天前 , 7F
bject -Begin {$c = 0} -Proces {Rename-Item -LiteralPat
10/19 18:05, 7F

10/19 18:05, 1天前 , 8F
h $_.FullName (Join-Path $_.DirectoryName ($_.Name -re
10/19 18:05, 8F

10/19 18:05, 1天前 , 9F
place '^(.{1,8}).*?(\.[^\.]+)?$', ('$1' + "_$c" + '$2'
10/19 18:05, 9F

10/19 18:05, 1天前 , 10F
))); $c++}
10/19 18:05, 10F

10/19 18:14, 1天前 , 11F
join-path 是多餘的,不需要給完整的目標
10/19 18:14, 11F

10/19 22:10, 22小時前 , 12F
用完整路徑只是為了避開一個bug,不過為此 -LiteralPath .
10/19 22:10, 12F

10/19 22:10, 22小時前 , 13F
也應該要改成 -LiteralPath $PWD.Path
10/19 22:10, 13F
感謝,不過運轉後,不是想要的。 想要的是這樣: 原檔名 ---> 新檔名 32010001(01) 32010001_01 32010001(02) 32010001_02 50000000(01) 50000000_01 60110000(01) 60110000_01 60110000(02) 60110000_02 71001111(01) 71001111_01 98765432(01) 98765432_01 大概就是保留指定的字元作為檔名,相同檔名進行編號,不同檔名的編號重新編號這樣。 ※ 編輯: jackygrap (114.39.33.135 臺灣), 10/19/2024 23:56:04

10/20 04:22, 16小時前 , 14F
$suffix=''; while(Test-path -LiteralPath ($newPath =
10/20 04:22, 14F

10/20 04:22, 16小時前 , 15F
Join-Path $_.DirectoryName ($baseName+$suffix+$extensi
10/20 04:22, 15F

10/20 04:22, 16小時前 , 16F
on))){$suffix = "_$c" -f c++}; Rename-Item $_ $newPath
10/20 04:22, 16F

10/20 04:22, 16小時前 , 17F
產生新路徑的地方大概改成這樣,至於把檔名拆成basename
10/20 04:22, 17F

10/20 04:22, 16小時前 , 18F
與副檔名的方法可以參考我上面用的正規表示法,因為5.1的
10/20 04:22, 18F

10/20 04:22, 16小時前 , 19F
split-path不支援分拆出basename
10/20 04:22, 19F

10/20 04:49, 15小時前 , 20F

10/20 04:50, 15小時前 , 21F
你可以參考這個函式
10/20 04:50, 21F

10/20 04:52, 15小時前 , 22F
這裡借用了.net 的 IO.Path 物件
10/20 04:52, 22F

10/20 05:24, 15小時前 , 23F
還有按照你的需求,不同檔案要重新計數,你不應該把初始值
10/20 05:24, 23F

10/20 05:24, 15小時前 , 24F
寫在 -Begin {} 中,因為它管道中只會執行一次,也就是只
10/20 05:24, 24F

10/20 05:24, 15小時前 , 25F
有第一個檔案之前會執行到
10/20 05:24, 25F

10/20 05:38, 14小時前 , 26F
應該在 -Process { } 中最上方
10/20 05:38, 26F

10/20 12:24, 8小時前 , 27F
就你的範例原本的編號如果是有效的 可以考慮直接沿
10/20 12:24, 27F

10/20 12:24, 8小時前 , 28F
10/20 12:24, 28F

10/20 13:45, 6小時前 , 29F
我覺得還是不要用Windows PowerShell 5.1吧
10/20 13:45, 29F

10/20 13:46, 6小時前 , 30F
要避開太多奇怪的問題了
10/20 13:46, 30F

10/20 13:48, 6小時前 , 31F

10/20 13:49, 6小時前 , 32F
左邊是內建的5.1,右邊是最新的跨平台版
10/20 13:49, 32F

10/20 13:53, 6小時前 , 33F
真的要用你就照h大的說法取原本括號內的編號來用就好
10/20 13:53, 33F

10/20 13:55, 6小時前 , 34F
用正規表示法選取字串,如果來源檔名保證規律用分割法即可
10/20 13:55, 34F

10/20 14:13, 6小時前 , 35F

10/20 14:17, 6小時前 , 36F
參考圖片就好,16f推文有個地方錯了
10/20 14:17, 36F

10/20 14:29, 6小時前 , 37F
檔名都規律的話 '^(.*?)\((\d+)\)(\.[^\.]+)$' 就可以了
10/20 14:29, 37F
文章代碼(AID): #1d4r_Vn3 (Windows)
文章代碼(AID): #1d4r_Vn3 (Windows)