带条件的自动文件夹结构创建

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 
}