任何想法/建议如何简化此代码?我想找到创建文件夹的不同方法,因为它们需要创建。
function TargetDir { # create folder structure for patches by OS type
if ($col6 -like "*WindowsXP*" -or $col4 -like "*Windows XP*"
) {$TargetDir = "$Path\$col1\XP"
if (!(Test-Path -path $TargetDir
)) {New-Item $Path\$col1\XP -type directory
New-Item -type file -Name $Col6 -Path $TargetDir}
else {New-Item -type file -Name $Col6 -Path $TargetDir}
}
elseif ($col6 -like "*Windows6.0*" -or $col4 -like "*Vista*"
) {$TargetDir = "$Path\$col1\Vista"
if (!(Test-Path -path $TargetDir
) ) {New-Item $Path\$col1\Vista -type directory
New-Item -type file -Name $Col6 -Path $TargetDir}
else {New-Item -type file -Name $Col6 -Path $TargetDir}
}
elseif ($col6 -like "*Windows6.1*" -or $col4 -like "*Windows 7*"
) {$TargetDir = "$Path\$col1\Win7"
if (!(Test-Path -path $TargetDir
) ) {New-Item $Path\$col1\Win7 -type directory
New-Item -type file -Name $Col6 -Path $TargetDir}
else {New-Item -type file -Name $Col6 -Path $TargetDir}
}
elseif ($col6 -like "*Windows8-RT*" -or $col4 -like "*Windows 8 *"
) {$TargetDir = "$Path\$col1\Win8"
if (!(Test-Path -path $TargetDir)
) {New-Item $Path\$col1\Win8 -type directory
New-Item -type file -Name $Col6 -Path $TargetDir}
else {New-Item -type file -Name $Col6 -Path $TargetDir}
}
elseif ($col6 -like "*Windows8.1*" -or $col4 -like "*Windows 8.1*"
) {$TargetDir = "$Path\$col1\Win81"
if (! (Test-Path -path $TargetDir)
) {New-Item $Path\$col1\Win81 -type directory
New-Item -type file -Name $Col6 -Path $TargetDir}
else {New-Item -type file -Name $Col6 -Path $TargetDir}
}
} # end if
感谢您提出如何简化此建议的任何建议。
答案 0 :(得分:1)
当您发现自己使用elseif
时,很多switch可能会在那里拯救您。
您正在检查$col4
或$col6
是否匹配正确?既然出现这种情况,你只需要检查其中一个值,只要它不是空白(只要忍受我)。另外,为了使你的功能更具可移植性(如果不适合你,那么对于其他人),那么我们将使用函数参数。
function Get-TargetDirectory{
param(
[string]$value1,
[string]$value2,
[string]$path,
[string]$directory
)
If($value1){$toMatch = $value1} #The value of $value1 is tested to contain a non empty string / null
If($value2){$toMatch = $value2} #The value of $value2 is tested to contain a non empty string / null
switch -Regex ($toMatch){
"Windows ?XP"{$TargetDir = "$Path\$directory\XP"}
"(Windows6\.0|Vista)"{$TargetDir = "$Path\$directory\Vista"}
"(Windows6\.1|Windows 7)"{$TargetDir = "$Path\$directory\Win7"}
"Windows ?8"{$TargetDir = "$Path\$directory\Win8"}
"Windows ?8\.1"{$TargetDir = "$Path\$directory\Win81"}
default{$TargetDir = ""}
}
If($TargetDir){ #The value of $TargetDir is tested to contain a non empty string / null
# Create the directory if it does not already exist
If(!(Test-Path -path $TargetDir)){[void](New-Item $TargetDir -type Directory)}
# Create the empty file in $TargetDir
New-Item -type file -Name $value1 -Path $TargetDir
}
}
我更改了函数中的名称以使其更友好。以下是他们如何映射到您以前的名字。
Yours Get-TargetDirectory
$col1 $directory
$col4 $value2
$col6 $value1
$path $path
不完美,因为有一些警告你还没有考虑到我所称的$directory
文件夹的存在。使用-Regex
关键字,我们可以简化匹配操作。此外,不需要多次创建项目的代码,因为它将被调用。
希望这个未经测试的代码适合您,并向您展示一些良好的编码实践。
答案 1 :(得分:1)
马特谢谢你的重播。我承认我几乎没有分享任何细节,但我心里想的更简单......你建议使用开关是这样做的关键。
switch -wildcard ($FileName)
{
"*6.0*" { $TargetDir = "$Path\Vista\" }
"*6.1*" { $TargetDir = "$Path\Windows 7\" }
"*8-R*" { $TargetDir = "$Path\Windows 8\" }
"*8.1*" { $TargetDir = "$Path\Windows 8.1\" }
default { write-host "Define target directory for $FileName" -foreground "red"}
}
if (Test-Path -path $TargetDir) {
New-Item $TargetDir -type directory
New-Item -type file -Name $FileName -Path $TargetDir
} else {
New-Item -type file -Name $FileName -Path $TargetDir -Force
}