确定路径是否存在并以干净的方式进行

时间:2018-01-22 22:08:36

标签: powershell

我最近不得不编写一个类似于此的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语句中,这可能令人沮丧。

在研究时,我遇到了这两个页面(12)并同意了所说的内容,因此我重构了我的代码:

$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时。它表明,按照我的方式使用旗帜,可能是一种设计气味。问题是我不确定如何重构我的代码。

我如何重构我的代码,以便:

  1. 我可以清楚地告诉用户哪些目录缺失
  2. 如果缺少一个或多个目录,我们无法继续

1 个答案:

答案 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,因此如果这非常重要,则必须检查函数中的路径类型。