【问题标题】:Merge multiple PowerShell scripts with the same objective - multi-dimensional conditionals合并具有相同目标的多个 PowerShell 脚本 - 多维条件
【发布时间】:2018-09-04 00:13:06
【问题描述】:

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

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

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

我阅读了很多关于开关 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
  • 不要在客户 shop_a 安装 java
  • 仅在客户 shop_a 停用 uac

当然,我可以为每个命令使用一个 if 子句,但我正在寻找一个很好且可维护的解决方案。你会推荐什么?

这是我在这里的第一个问题,请告诉我,我是否表述得足够清楚。 很抱歉拼写和语法错误,我的母语是德语。

【问题讨论】:

    标签: powershell deployment switch-statement conditional


    【解决方案1】:

    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】:

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

      嗯,很多人已经注意到,当您的代码中有很多选项时,使用 switch over if/then 可以提高性能。

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

      现在,不要误会我的意思,我见过一些非常复杂的 switch 语句,即使其中包含额外的 if/then。

      【讨论】:

        猜你喜欢
        • 2023-02-08
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 2018-10-30
        • 2018-02-11
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多