【问题标题】:PowerShell Function using ParamSets with a for loop使用带有 for 循环的 ParamSet 的 PowerShell 函数
【发布时间】:2015-10-27 18:28:15
【问题描述】:

我整理了一个用于安排服务器重启的 powershell 函数。

我坚持要添加 for loop 以使用 ParameterSetName 为多个服务器运行该函数。

在添加 ParamSet 之前,我只是设置了一个函数,并在 for 循环内的同一脚本中调用了该函数,效果很好。

Function ScheduleReboot{
[CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
Param(
    [Parameter(Mandatory=$false,ParameterSetName="KillSwitch")]
    [Switch]$NukeJobs,

    [Parameter(Mandatory=$true,
    HelpMessage="ServerName goes here",ParameterSetName="FullRun")]
    [string]$server,

    [Parameter(Mandatory=$true,
        HelpMessage="Enter a Date/Time 07-28-15 16:00 For July 28th, 2015 at 4:00 PM",
        ParameterSetName="FullRun"
    )]
    [ValidatePattern('(?#Enter MM-dd-YY HH:MM 24hr clock)\d{2}-\d{2}-\d{2}\s\d{2}[:]\d{2}')]
    $date,

    [Parameter(Mandatory=$false,ParameterSetName="ViewOnly")]
    [switch]$ViewOnly

) #"$server will reboot on $date"

    Switch ($PSCmdlet.ParameterSetName){
        "KillSwitch"{
            if($env:PROCESSOR_ARCHITECTURE -eq "x86")
            {
                set-alias ps64 "$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe"
                $script2 = [ScriptBlock]::Create("IF(Test-Path -Path C:\Windows\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\$server) 
                {Remove-Item -Force -Path C:\Windows\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\$server}")
                "Removing previous scheduled server reboot data"
                ps64 -command $script2
            } else {
                Get-ScheduledJob | Unregister-ScheduledJob
            }
        }#End killswitch block.

        "FullRun" {
            [array]$servers = gc D:\Scripts\servers.txt
            [array]$dates = gc D:\Scripts\dates.txt
            if($dates.Length -eq $servers.Length)
            {
                "Input count matches"
                for($i=0;$i -lt $servers.Length;$i++)
                {
                    $day =  $dates[$i]
                    $comp = $servers[$i]
                    $user = Get-Credential -UserName $env:USERNAME -Message "UserName/password for scheduled Reboot"
                    $trigger = New-JobTrigger -once -at $day
                    $script = [ScriptBlock]::Create("D:\Scripts\Scheduled-Reboot-Single.ps1 -server $server | Out-File -Force \\SysLogSvr\d$\scripts\$server-Reboot.log")
                    Register-ScheduledJob -Name $comp -Credential $user -Trigger $trigger -ScriptBlock $script
                }#end for loop
            } else {
                $warn = "Server list contains " + $servers.Count + " items and Date list contains " + $dates.Count + " items, Please re-check!!!"
                Write-Warning $warn
            }
        }#end fullrun block.

        "ViewOnly" {
            Get-ScheduledJob | Get-JobTrigger
            Get-ScheduledJob | Select Name,Command | FT -AutoSize
        }#end viewonly block.
    }#End param switch
}#end function.

【问题讨论】:

  • Before adding the ParamSets, I just setup a function and called the function in the same script within a for loop which worked great. 为什么你仍然不能这样做?或者,您可以让服务器接受数组 [String[]] 和/或从管道 [Parameter(ValueFromPipeline=$true)] 接受其值并使用 process{} 块。
  • 我在考虑使用 Begin/Process/End 但不确定这是最有效的方法。谢谢,我试试看。
  • @user4317867 “高效”指的是什么?在开始/处理/结束的开销在执行时间方面开始变得明显之前,您必须处理 大量 数量的服务器(数百万)
  • @MathiasR.Jessen 我只是不确定如何结束所有这些,但我会在明天继续工作。
  • @briantist 因为我不太确定如何在带有参数集的函数中合并循环。在参数集之前,循环只是为每个项目执行一个函数调用。

标签: powershell parameter-passing


【解决方案1】:

制作 3 个(或更多)不同的功能。该参数设置您使用它的方式过于复杂,并且难以调试。

我会创建一个Get-ScheduledRebootClear-ScheduledRebootSet-ScheduledReboot 函数集合。

发布的此脚本中有一些错误会导致您出现问题。首先是nuke参数集不包含server参数。另一个错误是让您失望的错误。您在上面定义了一个 $server 参数,但在函数中,您更改齿轮并从文本文件加载。您正在混合 $server$servers$comp 变量导致它失败。

您应该将收藏中的[string]$server 更改为[string[]]$server 或更好的[string[]$ComputerNameforeach($node in $ComputerName){...}。将文本文件加载保持在该函数之外。

【讨论】:

  • 感谢您的意见,我承认我在没有太多 PowerShell 知识的情况下将这些脚本放在一起。我正在清理它以供一般使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多