PowerShell重命名循环故障:从已编号文件启动时Test-Path失效
文件重命名循环问题及解决过程
问题场景
我需要实现一个文件重命名循环,该循环从无编号后缀的原始文件开始时可正常工作,但从已编号的文件开始时却失效。
重命名规则示例:
FILE.TXT [1]FILE.TXT [2]FILE.TXT
以FILE.TXT为起始文件时脚本运行正常,但以[353]FILE.TXT为起始文件时则失败。
初始脚本
$number=0 $originalname='[353]TestFile.txt' $nextname=$originalname while(Test-Path -LiteralPath "$nextname") { if ($nextname -match '^\[(\d+)\]') { $number = [int]$Matches[1] } $number++ $originalname -Replace '^\[(\d+)\]',"[$number]" $nextname=$originalname }else{ $nextname="[$number]$originalname" } Write-Host $nextname
修正后的脚本
我对循环进行了修正,修正后的脚本如下:
$number=0 $originalname='[353]TestFile.txt' if ($originalname -match '^\[(\d+)\]') { $number = [int]$Matches[1] } $nextname=$originalname while(Test-Path -LiteralPath "$nextname") { $number++ if ($nextname -match '^\[(\d+)\]') { $nextname = $nextname -Replace '^\[(\d+)\]',"[$number]" }else{ $nextname="[$number]$originalname" } } Write-Host $nextname
最终方案(2023年7月18日更新)
最终我改用了另一种同样唯一的命名规则,因为之前的脚本在对数百个含嵌套括号的文件进行压力测试时,即使添加了转义字符仍会出现随机问题。以下是使用非特殊字符的可靠版本:
$number=0 $originalname='TestFile.txt' if ($originalname -match '^DUPLICATE -(\d+)-') { $number = [int]$Matches[2] } $nextname=$originalname while(Test-Path -LiteralPath "$nextname") { $number++ if ($nextname -match '^DUPLICATE -(\d+)-') { $nextname = $nextname -Replace '^DUPLICATE -(\d+)-',"DUPLICATE -$number-" }else{ $nextname="DUPLICATE -$number- $originalname" } } Write-Host $nextname
内容的提问来源于stack exchange,提问作者PlayLORD-SysOp
相关产品推荐
相关产品推荐

