将 'If' 和 'ElseIf' 与来自不同目录的 get-childitem 一起使用

Using 'If' and 'ElseIf' with get-childitem from different directories

我想从 20 个目录中取出 3 个目录中的文件。我有一个 GUI 设置来输出一个 $year 变量。选项为 2017、2018、2019 和 Select 全部。 我想将文件复制到不同的文件夹,最好保持完整的文件夹结构。

$year = '2018'

if ($year = '2017') {
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2017' -Recurse
} elseif ($year = '2018') {
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2018' -Recurse
} elseif ($year = '2019') {
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2019' -Recurse
} elseif ($year = 'Select All') {
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2017'
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2018'
    Get-ChildItem -Path $sourcePath'\Warranty Claims 2019'
} else {
    "This didn'nt work"
}
# = files

这是想法,但行不通。由于下面的代码,我希望将其输出放入变量 $files 中。我对其他方法持开放态度,但从新手的角度来看,这似乎是最合乎逻辑的。

foreach ($file in $files){
    $sourcePathFile = $file.FullName
    $destinationPathFile = $file.FullName.Replace($sourcePath,  $destinationPath)

    $exists = Test-Path $destinationPathFile

    if (!$exists) {
        $dir = Split-Path -Parent $destinationPathFile
        if (!(Test-Path($dir))) { New-Item -ItemType Directory -Path $dir }
        Copy-Item -Path $sourcePathFile -Destination $destinationPathFile -Recurse -Force
    } else{
        $isFile = Test-Path -Path $destinationPathFile -PathType Leaf

        if ($isFile) {
            $different = Compare-Object -ReferenceObject $(Get-Content $sourcePathFile) -DifferenceObject $(Get-Content $destinationPathFile)
            if (Compare-Object -ReferenceObject $(Get-Content $sourcePathFile) -DifferenceObject $(Get-Content $destinationPathFile)) {
                $dir = Split-Path -Parent $destinationPathFile
                if (!(Test-Path($dir))) { New-Item -ItemType Directory -Path $dir }
                Copy-Item -Path $sourcePathFile -Destination $destinationPathFile -Recurse -Force
            }
        }
    }
}

在进行比较的条件语句中,应考虑使用Comparison_Operators。等于由运算符 -eq 表示。 =用于变量赋值。您可以转换代码以反映这一点。 if-else 块的输出可以设置为变量 ($files).

$files = 
    If ($year -eq '2017') {
        Get-ChildItem -Path $sourcePath'\Warranty Claims 2017'  -Recurse
     } 
    ElseIf ($year -eq '2018') {
        Get-ChildItem -Path $sourcePath'\Warranty Claims 2018'  -Recurse
    }   
    ElseIf ($year -eq '2019') {
        Get-ChildItem -Path $sourcePath'\Warranty Claims 2019'  -Recurse
    }     
    ElseIf ($year -eq 'Select All') {
       Get-ChildItem -Path $sourcePath'\Warranty Claims 2017' 
       Get-ChildItem -Path $sourcePath'\Warranty Claims 2018' 
       Get-ChildItem -Path $sourcePath'\Warranty Claims 2019'  
        }
    Else {    
        "This didn't work"
    }

如果您遇到特殊情况,除了操作员问题之外,您可能会遇到意想不到的结果。考虑以下示例:

If ($year = '2017') {
   "It is 2017"
} Else {
    "Wrong year"
}

It is 2017
$year
2017

如果 $year 可以成功地分配一个通常在条件中计算为 $true 的值,那么 if 条件将为真 $year将更新为新值。

考虑以下 if 不会计算为 $true 的示例。这里 0 评估为 $false 分配成功更新 $year0.

If ($year = 0) {
   "It is 2017"
} Else {
    "Wrong year"
}

Wrong year
$year
0

这也是一个转换的机会:

$year = 2017,2018

$files = switch ($year) {  # $year can be an array
  2017 { dir $sourcePath'\Warranty Claims 2017' -R } 
  2018 { dir $sourcePath'\Warranty Claims 2018' -R } 
  2019 { dir $sourcePath'\Warranty Claims 2019' -R } 
  'Select All' {
    dir $sourcePath'\Warranty Claims 2017',
      $sourcePath'\Warranty Claims 2018',
      $sourcePath'\Warranty Claims 2019'
  } 
  default {"This didn't work"}
}

$files