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

时间:2015-01-26 19:47:22

标签: powershell simplify

任何想法/建议如何简化此代码?我想找到创建文件夹的不同方法,因为它们需要创建。

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

感谢您提出如何简化此建议的任何建议。

2 个答案:

答案 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 
}