带条件的自动文件夹结构创建
automated folder structure creation with conditions
有什么想法/建议可以简化这段代码吗?我想找到不同的方法来创建需要创建的文件夹。
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
感谢您提出如何简化这方面的任何建议。
当您发现自己经常使用 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
关键字我们可以简化匹配操作。此外,无需让创建项目的代码存在多次,因为无论如何都会调用它。
希望这个未经测试的代码对您有用,并向您展示一些良好的编码实践。
马特感谢您的重播。我承认我几乎没有分享细节,但我想到了更简单的事情......你使用 switch 的建议是实现它的关键。
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
}
有什么想法/建议可以简化这段代码吗?我想找到不同的方法来创建需要创建的文件夹。
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
感谢您提出如何简化这方面的任何建议。
当您发现自己经常使用 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
关键字我们可以简化匹配操作。此外,无需让创建项目的代码存在多次,因为无论如何都会调用它。
希望这个未经测试的代码对您有用,并向您展示一些良好的编码实践。
马特感谢您的重播。我承认我几乎没有分享细节,但我想到了更简单的事情......你使用 switch 的建议是实现它的关键。
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
}