代码之家  ›  专栏  ›  技术社区  ›  Semolor

合并具有相同目标的多个PowerShell脚本-多维条件

  •  3
  • Semolor  · 技术社区  · 6 年前

    我正在使用PowerShell在WDS部署后配置系统。 目前,我为每个操作系统和用例都有一个脚本,通过 Unattend.xml 文件

    现在我的问题是,当我想更改一些常规内容时,我必须在每个脚本中更改它。

    所以我想,我应该将它们合并在一起,并将模式作为参数传递(例如customer)或从系统中读取(例如,当我只想为一个os版本或制造商运行特定命令时)。

    我读了很多关于交换机的书 here ,但我不确定这是否是本案的最佳做法。

    我将启动定义参数的脚本

    Param([string]$customer)
    $manufacturer = (Get-CimInstance Win32_ComputerSystem).Manufacturer
    $os = (Get-CimInstance Win32_OperatingSystem).version
    

    这是我粘贴在一起的脚本的一部分:

    Write-Output "runnig deskupdate..."
        Start-Process "$install\deskupdate\ducmd.exe" -ArgumentList "/WEB /DRV" -NoNewWindow -Wait
    
    Write-Output "installing java..."
        Get-ChildItem $install\programs -Filter "jre-*" | ForEach {Start-Process $_.Fullname -ArgumentList "/s" -NoNewWindow -Wait}
    
    Write-Output "installing 7zip..."
        Get-ChildItem $install\programs -Filter "7z*" | ForEach {Start-Process $_.Fullname -ArgumentList "/S" -NoNewWindow -Wait}
    Write-Output "deactivating uac..."  
        New-ItemProperty -Path HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system -Name EnableLUA -PropertyType DWord -Value 0 -Force
    

    现在我想把它分开,这样我就可以

    • 仅在fujitsu系统上运行deskupdate
    • 随处安装7zip
    • 不在customer shop\u a安装java
    • 仅在customer shop\u a停用uac

    当然,我可以对每个命令使用if子句,但我正在寻找一个好的、可维护的解决方案。你有什么建议吗?

    这是我在这里的第一个问题,请让我知道,我是否已经把它表述得足够清楚了。 对不起,拼写和语法错误,我的母语是德语。

    2 回复  |  直到 6 年前
        1
  •  1
  •   mklement0    6 年前

    PowerShell的 switch statement 非常灵活:

    Param([string] $customer)
    
    $manufacturer = (Get-CimInstance Win32_ComputerSystem).Manufacturer
    
    switch (@{ manufacturer = $manufacturer; customer = $customer }) {
      { $_.manufacturer -eq 'Fujitsu' } { 'run deskupdate' }
      { $True }                         { 'install 7zip'   } # unconditional action
      { $_.customer -ne 'shop_A' }      { 'install java'   }
      { $_.customer -eq 'shop_A' }      { 'deactivate UAC' }
    }
    

    注意如何通过 哈希表 ( @{ ...; ... } )。

    脚本块形式的条件句( { ... } )然后可以访问哈希表 $_ 并查询其属性;类似地,关联的操作脚本块可以通过访问哈希表 $_

    除非执行关联的脚本块,否则每个匹配条件都将独立计算 break

        2
  •  1
  •   postanote    6 年前

    通常的做法是,如果你的if/then计数大于5,或者你有很多选择。最好使用switch语句。

    好吧,很多人都注意到了在代码中有许多选项时使用切换if/then的性能提高。

    所以,有很多选择,速度快,可读性强,维护=切换。

    现在,不要误会我的意思,我已经看到了一些非常复杂的switch语句,即使其中有额外的if/then。