我最近不得不编写一个类似于此的Powershell脚本(非实际脚本,这是mcve):
function verify_file{
param([string]$path_to_file)
return Test-Path ($path_to_file)
}
$source_file = "$env:USERPROFILE\Desktop\Images"
$destination_file = "$env:USERPROFILE\Desktop\ISO"
if ((verify_file -path_to_file $source_file) -and
(verify_file -path_to_file $destination_file)){
Write-Output("Good to go")
}else{
Write-Output("We have trouble")
}
问题是,它看起来很乱,你无法明确说明缺少哪个目录。如果我需要验证另一条路径,那么我需要添加到if
语句中,这可能令人沮丧。
在研究时,我遇到了这两个页面(1,2)并同意了所说的内容,因此我重构了我的代码:
$process_paths = @{}
$process_paths.Add("Images",$source_file)
$process_paths.Add("Destination",$destination_file)
$toProceed = $true
foreach($varPath in $process_paths.GetEnumerator()){
verify_file -path_to_file $varPath.Value
if((verify_file -path_to_file $varPath) -eq $false){
# Yes, I know using the "+" is bad, but see the bigger picture :D
Write-Output ($varPath.Name + " doesn't exist")
$toProceed = $false
}
}
if($toProceed){
# ops with the variables
}
我喜欢这种方法,如果我有另一条路径要验证,我只需将它添加到哈希表中,然后让循环处理它。无需添加另一个if
语句,我可以准确指定缺少哪个目录。
一切都很好,直到今天,当我遇到这个page时。它表明,按照我的方式使用旗帜,可能是一种设计气味。问题是我不确定如何重构我的代码。
我如何重构我的代码,以便:
答案 0 :(得分:1)
这是你可以做到的一种方式:
function Test-PathEx {
param(
[String[]] $path
)
foreach ( $pathItem in $path ) {
if ( -not (Test-Path -LiteralPath $pathItem) ) {
return $pathItem
}
}
}
$missing = Test-PathEx "A","B","C"
if ( $missing ) {
throw "Path does not exist - '$missing'"
}
请注意,对于不是特定目录的路径,Test-Path
也返回$true
,因此如果这非常重要,则必须检查函数中的路径类型。