PowerShell:如何重复校验条件直至输入有效的目标路径?
解决PowerShell脚本重复提示输入有效目标路径的问题
这是个非常棒的细节优化!确实,哪怕是边缘场景,处理好也能大幅提升脚本的健壮性。我们可以通过**do-while循环**来实现重复提示用户输入,直到得到一个不存在的目标路径。下面是修改后的完整脚本:
Function Copy-DirectoryStructure{ [CmdletBinding()] Param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string]$Path ) # 测试路径是否为驱动器根目录 if($Path -match '^[a-zA-Z]:\\$' -or $Path -match '^[a-zA-Z]:$'){ throw "Path cannot be at the root of a drive. Aborting." } # 检查路径是否有效 if(Test-Path -Path $Path -PathType Container){ # 生成初始目标路径格式 $DestinationPath = (Get-Item $Path).FullName + ' Folder Copy' # 如果初始目标路径已存在,进入循环提示用户输入新名称 if (Test-Path -Path $DestinationPath -PathType Container) { do { # 提示用户当前路径已存在 Write-Warning "The destination path '$DestinationPath' already exists." # 获取用户输入的新文件夹名 $NewFolderName = Read-Host -Prompt "Input the name of the new folder to be created" # 处理空输入或纯空白字符的情况 while ([string]::IsNullOrWhiteSpace($NewFolderName)) { Write-Warning "Folder name cannot be empty or whitespace. Please try again." $NewFolderName = Read-Host -Prompt "Input the name of the new folder to be created" } # 安全拼接新的目标路径 $DestinationPath = Join-Path -Path (Get-Item $Path).Parent.FullName -ChildPath $NewFolderName # 只要目标路径存在,就继续循环提示 } while (Test-Path -Path $DestinationPath -PathType Container) } # 开始复制目录结构(不包含文件) robocopy $Path $DestinationPath /e /xf *.* | Out-Null Write-Host "Directory structure copied successfully to '$DestinationPath'" } else { throw "Invalid directory was passed. Aborting." } } # 调用示例 Copy-DirectoryStructure -Path "C:\Users\[username]\Desktop\Test"
关键修改点说明
do-while循环:先执行一次输入逻辑,再检查路径是否存在,只要存在就重复提示,彻底解决重复路径的问题。- 空输入校验:内层循环过滤掉空字符串或纯空格的输入,避免生成无效路径。
Join-Path路径拼接:替代手动字符串拼接,自动处理路径分隔符,避免出现\\这类错误路径。- 明确的提示信息:每次提示都会显示已存在的路径,让用户更清晰地理解操作要求。
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

