PowerShell脚本问题:按部分字符串检测文件夹并循环创建递增命名文件夹
修复PowerShell循环检测并创建递增序列文件夹的问题
需求说明
实现循环逻辑,检测目标目录下是否存在名称包含特定日期字符串且以三位数字结尾的文件夹(变量$FolderSeqSRC对应数字):
- 若不存在该序列的文件夹,则创建它
- 若存在,则将三位数字递增后重新检测,直到找到未被使用的序列
原代码
$FolderDate = (Get-Date).ToString('yyMMdd'); $FolderSeqSRC = 1; $FolderSeq = ([string]$FolderSeqSRC).PadLeft(3,'0'); $FolderDescript = "Test" $NewFolderName = "$FolderDate-$FolderSeq $FolderDescript"; $FolderSearchName = "$FolderDate-$FolderSeq" $OldFileName = "C0"; $NewFileName = "$FolderDate-$FolderSeq-"; Write-Host "$FolderDate"; Write-Host "$NewFolderName"; while (-not $completed) { if (-Not (Test-Path -Path $targetDir\$FolderSearchName*)) { "Path $FolderSearchName doesn't exist: creation in progress." $completed = $true } else { "Path $FolderSearchName exists!" $FolderSeqSRC++; $FolderSeq = ([string]$FolderSeqSRC).PadLeft(3,'0'); $FolderSearchName = "$FolderDate-$FolderSeq" $NewFolderName = "$FolderDate-$FolderSeq $FolderDescript"; $NewFileName = "$FolderDate-$FolderSeq-"; "Trying path $FolderSearchName next." $completed = $false } New-Item -ItemType Directory -Force -Path "$targetDir\$NewFolderName" $completed = $true }
当前问题
脚本仅能成功检测并创建-001文件夹,若-001存在则创建-002,但无法继续递增到-003及以后的序列。
问题原因
原循环逻辑中,无论当前序列的文件夹是否存在,循环体末尾都会执行New-Item并强制设置$completed = $true,导致即使检测到当前序列存在并完成递增,也会直接创建新序列的文件夹并退出循环,无法继续检测新序列是否已存在。
修复后的代码
$FolderDate = (Get-Date).ToString('yyMMdd'); $FolderSeqSRC = 1; $FolderSeq = ([string]$FolderSeqSRC).PadLeft(3,'0'); $FolderDescript = "Test" $NewFolderName = "$FolderDate-$FolderSeq $FolderDescript"; $FolderSearchName = "$FolderDate-$FolderSeq" $OldFileName = "C0"; $NewFileName = "$FolderDate-$FolderSeq-"; Write-Host "$FolderDate"; Write-Host "$NewFolderName"; # 初始化循环标志 $completed = $false while (-not $completed) { if (-Not (Test-Path -Path "$targetDir\$FolderSearchName*")) { "Path $FolderSearchName doesn't exist: creation in progress." # 仅当路径不存在时才创建文件夹并结束循环 New-Item -ItemType Directory -Force -Path "$targetDir\$NewFolderName" $completed = $true } else { "Path $FolderSearchName exists!" $FolderSeqSRC++; $FolderSeq = ([string]$FolderSeqSRC).PadLeft(3,'0'); $FolderSearchName = "$FolderDate-$FolderSeq" $NewFolderName = "$FolderDate-$FolderSeq $FolderDescript"; $NewFileName = "$FolderDate-$FolderSeq-"; "Trying path $FolderSearchName next." # 路径存在,继续循环检测下一个序列 $completed = $false } }
修改说明
- 将
New-Item和$completed = $true移动到if分支内部,确保只有当检测到当前序列的文件夹不存在时,才执行创建操作并结束循环。 - 移除了循环体末尾强制设置
$completed = $true的代码,保证当序列存在时,循环能继续执行,直到找到未被使用的序列。
内容的提问来源于stack exchange,提问作者tnpir4002
相关产品推荐
相关产品推荐

