2015-06-24 4 views
0

У меня есть несколько функций, используя тот же метод, чтобы вызвать другую функцию или делать определенные вещи:PowerShell рефакторинга функции в одной основной функции

function doMyFn 
{ 
    if ($getProject -match 'all') 
    { 
     foreach ($project in $projectAllowedLst) 
     { 
      # section a 
      # params to be passed to the script block below in this case it is $project 
      # the command or function that are being called are to be set here (based on the $project) 
     } 
    } 
    elseif ($getProject -match ',') 
    { 
     $projects = $getProject -split (',') 

     foreach ($project in $projects) 
     {   
      # section b 
      # params to be passed to the script block below in this case it is $project 
      # the command or function that are being called are to be set here (based on the $project) 
     } 
    } 
    elseif ($getProject -notmatch ',') 
    { 
      # section c 
      # params to be passed to the script block below in this case it is $getProject  
      # the command or function that are being called are to be set here (based on the $getProject) 
    } 
} 

другая функция, которая выглядит следующим образом:

if (testBeforeBackup $project){doProjectBackup $project} else {updateXML $project} 

и блок с переключателем и функцией, как показано ниже. Все они используются в основной функции выше во всех разделах названного раздел а, б, в

#function 1 
function one { 
    if ($getProject -match 'all') 
    { 
     foreach ($project in @('de','idm')) 
     { 
      copyXML $project 
     } 
    } 
    elseif ($getProject -match ',') 
    { 
     $projects = $getProject -split (',') 

     foreach ($project in $projects) 
     { 
      copyXML $project 
     } 
    } 
    elseif ($getProject -notmatch ',') 
    { 
     copyXML $getProject 
    } 
} 

#function 2 
function two { 
    if ($getProject -match 'all') 
    { 
     foreach ($project in $projectAllowedLst) 
     { 
      $dstAppList[$project] = readNewAppName $project 
     } 
    } 
    elseif ($getProject -match ',') 
    { 
     $projects = $getProject -split (',') 

     foreach ($project in $projects) 
     { 
      $dstAppList[$project] = readNewAppName $project 
     } 
    } 
    elseif ($getProject -notmatch ',') 
    { 
      $dstAppList[$getProject] = readNewAppName $getProject 
    } 
} 

#function 4 
funciton four { 

    if ($getProject -match 'all') 
    { 
     foreach ($project in $projectAllowedLst) 
     { 
      switch($project) 
      { 
       'de'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $e_dst_folder $noDeleteEfolders 
         } 
        } 
       'home'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $home_dst_folder $noDeleteHomefolders 
         } 
        } 
       'idm'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $i_dst_folder $noDeleteifolders 
         } 
        } 
      } 
      copyProject $project 
     } 
    } 
    elseif ($getProject -match ',') 
    { 
     $projects = $getProject -split (',') 

     foreach ($project in $projects) 
     { 
      switch($project) 
      { 
       'de'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $e_dst_folder $noDeleteEfolders 
         } 
        } 
       'home'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $home_dst_folder $noDeleteHomefolders 
         } 
        } 
       'idm'{ 
         if (testBeforeBackup $project) 
         { 
          deleteFiles $i_dst_folder $noDeleteifolders 
         } 
        } 
      } 

      copyProject $project 
     } 
    } 
    elseif ($getProject -notmatch ',') 
    { 
      switch($getProject) 
      { 
       'de'{ 
         if (testBeforeBackup $getProject) 
         { 
          deleteFiles $e_dst_folder $noDeleteEfolders 
         } 
        } 
       'home'{ 
         if (testBeforeBackup $getProject) 
         { 
          deleteFiles $home_dst_folder $noDeleteHomefolders 
         } 
        } 
       'idm'{ 
         if (testBeforeBackup $getProject) 
         { 
          deleteFiles $i_dst_folder $noDeleteifolders 
         } 
        } 
      } 

      copyProject $getProject 
    } 


} 

есть некоторые переменные, которые будут доступны из сферы Script поэтому не стоит беспокоиться о других переменных.

Как я могу реорганизовать его лучше?

+1

Я не думаю, что это ясно, что вы пытаетесь выполнить здесь. Считаете ли вы, что ваши вызовы функций содержат слишком много кода, поскольку есть много повторений? Вы пытаетесь объединить свои функции .... Также я вижу только одну функцию здесь и 3 набора кода. Я мог видеть, что у вас проблемы с путаницей, но я немного потерял это. – Matt

+0

Если вы просто добавили блок 'Param ([Switch] $ A; [Switch] $ B; [Switch] $ C)' к вашей функции с помощью переключателей вы можете назвать свою функцию так, как вам нравится. – DarkLite1

+0

Я добавил свои 3 функции, что они используют один и тот же шаблон, но для того, чтобы делать разные вещи внутри, я хочу объединить их все в одну функцию и вызвать все остальные функции в качестве параметров, которые будут использоваться в этой основной функции, или если любые другие предложения – Vagho

ответ

0

Я считаю, что вы хотите, чтобы ваша функция реагировать на all как один параметр, а не как говорят, «стены, баш» - это вещь матчиall тоже. То, что вы просите, известно как «правильные параметры синтаксического анализа», и на самом деле вам нужно рассматривать только «все» дело, все остальное может быть madde в массив, а затем рассматриваться как массив в следующем коде.

Предполагая $projectAllowedLst, что вы должны разобрать, если получил «все» в параметре, это должно сделать трюк:

if ($getProject -ieq "all") {$getProject=$projectAllowedLst} 
foreach ($project in $getProject) { 
    # main body, only dependent on $project 
} 

UPDATE: Вы должны сделать больше с вашими проектами, я вижу, что логически связаны переменные в вашем коде, которые, как представляется, содержат различные данные об одном проекте. Таким образом, вы делаете свой проект в хеш-таблицу, причем каждое описание проекта содержит поля для папки назначения, защищенные папки (?) И имя. Пример:

$projectAllowedLst = @() # an array of projects 
$projectAllowedLst += @{ 
    "Name" = "de"; 
    "DestinationFolder" = $e_dst_folder; 
    "ProtectedFolders" = $noDeleteEfolders 
} # "de" project 
# same for other projects. 

Тогда, к примеру, ваша «функция четыре» будет переписать так:

function four (param $getProject) { 
    if ($getProject -ieq "all") {$getProject=$projectAllowedLst} 
    foreach ($project in $getProject) { 
     deleteFiles $project.DestinationFolder $project.ProtectedFolders 
     copyProject $project # better rewrite this one to use full project data 
    } 
} 

Это, однако, отключить вас от жесткого кодирования "de","idm" в своих функциях, потому что вы будете должны заполнить полные данные проекта в copyXML, чтобы он работал, но, как правило, делает ваш код более чистым и более структурированным, а также потенциально позволяет расширять его для поддержки большего количества проектов без перезаписи каждой отдельной функции.

ОБНОВЛЕНИЕ 2: Если вы по какой-то причине решили разрешить пользователю (или самому себе) передавать список имен проектов, вы все равно можете это сделать, но вам придется самостоятельно управлять типом объекта. Пример:

function copyXML (param $projects) { 
    foreach ($project in $projects) { 
     if ($project.getType().fullname -eq "System.String") { 
      # we've been given a string - search for name 
      $detailedProject = $projectAllowedLst | where {$_.name -eq $project} 
      if ($detailedProject.getType().fullName -ne "System.Collections.Hashtable") 
       { $detailedProject=$detailedProject[0]} 
      # TWO OR MORE projects? Take first one 
      $project=$detailedProject 
     } 
     # do your stuff with complete project data 
    } 
} 
+0

my $ projectAllowedLst = @ ('a', 'b', 'c'), поэтому существует разница в пользовательском вводе, случаи: 1 - входы: все 2 - входы: a, c 3 - входы : b так что разница во всех 3 случаях – Vagho

+0

@ Vagho Просмотреть обновленное сообщение, есть решение для реализации, если вам предоставлен проект (хэш-таблица) или строка (ее название). – Vesper