2015-01-26 2 views
0

любая идея/предложение, как упростить этот код? Я хотел бы найти другой подход к созданию папок, поскольку они должны быть созданы.автоматическое создание структуры папок с условиями

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

Для начала я бы использовал оператор switch. '$ col #' не определен в этой функции, так что это не должно работать как – Matt

+0

, это работает, поверьте мне. $ col определяется в другом месте. Я попробую переключатель. –

+0

Хорошо ... если он работает, то область нечетна, но хорошей практикой является использование локальной области, когда это возможно. Нет причин для вас не передавать несколько переменных функции, что делает ее разумной и более переносимой, если вы используете ее где-то в другом месте. Я не вижу, где много этих переменных заполняются как '$ TargetDir' и' $ Path'. Буква должна быть $ null, глядя на это. Если вы закроете и снова откроете PowerShell, он по-прежнему работает? – Matt

ответ

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 
} 
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, мы можем упростить операции совпадения. Кроме того, нет необходимости иметь код для создания элементов несколько раз, так как он будет вызываться независимо.

Надеюсь, этот непроверенный код работает для вас и показывает вам хорошие методы кодирования.

 Смежные вопросы

  • Нет связанных вопросов^_^