将 '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
和 分配成功更新 $year
到 0
.
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
我想从 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
和 分配成功更新 $year
到 0
.
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