PowerShell-尝试以较少的冗余构造脚本

PowerShell-尝试以较少的冗余构造脚本,powershell,Powershell,摘要: 我正试图用更少的冗余来构建我的脚本。问题是,我必须为每个交换机重复一个功能,尽管它们将到达相同的目的地并完成相同的任务 问题: 是否可以将年龄、姓名和职业转换为单个功能 旁注: 我正在使用一个psobject并存储它的URI,枚举它并将$Search变量实例化为为psobject中每个成员指定的URI function Search-PersonnelData { param( [switch]$Name, [switch]$Age, [switch]$Pro

摘要: 我正试图用更少的冗余来构建我的脚本。问题是,我必须为每个交换机重复一个功能,尽管它们将到达相同的目的地并完成相同的任务

问题: 是否可以将年龄、姓名和职业转换为单个功能

旁注: 我正在使用一个psobject并存储它的URI,枚举它并将$Search变量实例化为为psobject中每个成员指定的URI

function Search-PersonnelData {
  param(
    [switch]$Name,
    [switch]$Age,
    [switch]$Profession,
    [switch]$All,
    [switch]$Less,
    [switch]$Count,
    [string]$Search,
    [string]$Limit
  )
    if ($Limit.Length -eq 0  -or ($Limit -match $invalidnumber))
    {
      $Limit = 15
      Write-Warning -Message 'Invalid limit specified, setting to 15 by default'
    }

 # HERE IS WHERE I AM REPEATING THE SAME FUNCTION OVER
    # Name Query
    if($Name)
    {
    $searchTerms = Get-QueryType -userinput Name
    $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession
    }
    # Age Query
    if($Age)
    {
    $searchTerms = Get-QueryType -userinput Age
    $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession
    }
    # Profession Query
    if($Profession)
    {
      $searchTerms = Get-QueryType -userinput 'Profession'
      $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession
    }
 ##########################Here is where there repeition ends###############################
    if($Results.DataBase.UUID.Count -eq 0)
    {
      Write-Warning -Message 'No results found'
      break
      }
      if($SignatureCount -eq $true)
      {
        $Results.DataBase| Group-Object | Select-Object -Property count,name -ExcludeProperty RunspaceId
      }
      if($Less -eq $true)
      {
        $Results.DataBase | Select-Object -Property $TableFormat -ExcludeProperty RunspaceId
      }
      if($All -eq $true)
      {
        $Results.DataBase | Select-Object -Property $Gridtable -ExcludeProperty RunspaceId
      }
      if($Count -eq $false -and ($less -eq $false)-and ($all -eq $false))
      {
        $Results.DataBase| Select-Object -Property $TableFormat | Format-Table -AutoSize
        $Results.DataBase | Group-Object | Select-Object -Property count,name -ExcludeProperty RunspaceId | Format-Table -AutoSize
      }
}
$EndPoints = New-Object psobject
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Profession' -Value "by_profession"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Age' -Value "by_age"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name Name -Value "by_Name"


function Get-QueryType {
  param(
    $userinput
  )
  $EndPoints.psobject.Members |
  Where-Object {$_.Name -eq $userinput } |
  ? {$_.Membertype -eq "noteproperty"} | 
  %{ $_.Value }
}

因此,我建议您使用哈希表进行查找:

function Search-PersonnelData {
    param(
        [ValidateSet('Name', 'Age', "Profession")]
        [string]$queryType,
        ...
    )
    ...

    $hashtable = @{
        "Name"          = "by_name"
        "Age"           = "by_age"
        "Profession"    = "by_profession"
    }

    $searchTerms = $hashtable[$queryType]
    $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession
    ...
}
编辑,忘记添加,我完全删除了所有这些代码:

$EndPoints = New-Object psobject
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Profession' -Value "by_profession"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Age' -Value "by_age"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name Name -Value "by_Name"


function Get-QueryType {
param(
    $userinput
)
$EndPoints.psobject.Members |
Where-Object {$_.Name -eq $userinput } |
? {$_.Membertype -eq "noteproperty"} | 
%{ $_.Value }
}

因此,我建议您使用哈希表进行查找:

function Search-PersonnelData {
    param(
        [ValidateSet('Name', 'Age', "Profession")]
        [string]$queryType,
        ...
    )
    ...

    $hashtable = @{
        "Name"          = "by_name"
        "Age"           = "by_age"
        "Profession"    = "by_profession"
    }

    $searchTerms = $hashtable[$queryType]
    $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession
    ...
}
编辑,忘记添加,我完全删除了所有这些代码:

$EndPoints = New-Object psobject
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Profession' -Value "by_profession"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name 'Age' -Value "by_age"
Add-Member -InputObject $EndPoints -MemberType NoteProperty -Name Name -Value "by_Name"


function Get-QueryType {
param(
    $userinput
)
$EndPoints.psobject.Members |
Where-Object {$_.Name -eq $userinput } |
? {$_.Membertype -eq "noteproperty"} | 
%{ $_.Value }
}

虽然有点长,但我认为您可以执行以下操作:

($Name,'Name'), ($Age,'Age'), ($Profession,'Profession') | % { if ($_[0]) { $searchTerms = Get-QueryType -userinput $_[1], $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession} }  
顺便说一句,您大多数时候都正确地使用了带有布尔变量的if,如果您像这样更改代码的其他部分,则可以节省大量行:

if($Limit.Length -eq 0), if($SignatureCount -eq $true)
致:


虽然有点长,但我认为您可以执行以下操作:

($Name,'Name'), ($Age,'Age'), ($Profession,'Profession') | % { if ($_[0]) { $searchTerms = Get-QueryType -userinput $_[1], $Results = Invoke-RestMethod -Method Get -Uri $apiUrl$searchTerms"?term=$Search&limit=$Limit" -WebSession $currentsession} }  
顺便说一句,您大多数时候都正确地使用了带有布尔变量的if,如果您像这样更改代码的其他部分,则可以节省大量行:

if($Limit.Length -eq 0), if($SignatureCount -eq $true)
致:


姓名、年龄和职业搜索是否应该相互排斥?如果您有多个开关,看起来您将覆盖
$results
。因此,看起来您希望使用参数集,然后对所使用的集执行一个
switch
语句。@BenH是的,这是正确的,这些开关是互斥的。这是我脚本的最佳结构吗?我觉得这些功能是完全冗余和有缺陷的。姓名、年龄和职业搜索应该是相互排斥的吗?如果您有多个开关,看起来您将覆盖
$results
。因此,看起来您希望使用参数集,然后对所使用的集执行一个
switch
语句。@BenH是的,这是正确的,这些开关是互斥的。这是我脚本的最佳结构吗?我觉得这些功能是完全冗余和有缺陷的。我会尝试这个改变,并将结果发回。谢谢。这是一个很好的解决方案,但是,有没有一种聪明的方法可以自动完成职业、年龄和姓名的设置?我想我将创建一些函数来别名这些函数。就像函数age{Get PersonnelData age}好的,我发现Tab补全确实有效——QueryType会建议年龄、职业、姓名。再次感谢。不仅如此,它将不允许将任何其他内容传递给itI。我将尝试此更改并返回结果。谢谢。这是一个很好的解决方案,但是,有没有一种聪明的方法可以自动完成职业、年龄和姓名的设置?我想我将创建一些函数来别名这些函数。就像函数age{Get PersonnelData age}好的,我发现Tab补全确实有效——QueryType会建议年龄、职业、姓名。再次感谢。不仅如此,它不会允许任何其他信息传递给它