使用带有for循环的参数集的PowerShell函数
我编写了一个powershell函数,用于安排服务器重新启动 我一直在添加for循环,以便使用ParameterSetName为多个服务器运行该函数 在添加ParamSets之前,我只需设置一个函数,并在for循环中的同一脚本中调用该函数,效果非常好使用带有for循环的参数集的PowerShell函数,powershell,parameter-passing,Powershell,Parameter Passing,我编写了一个powershell函数,用于安排服务器重新启动 我一直在添加for循环,以便使用ParameterSetName为多个服务器运行该函数 在添加ParamSets之前,我只需设置一个函数,并在for循环中的同一脚本中调用该函数,效果非常好 Function ScheduleReboot{ [CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")] Param( [Paramet
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.
使其具有3个或更多不同的功能。参数设置了您使用它的方式,这使它过于复杂,并且使您难以调试它 我会制作一个Get scheduledeboot、Clear scheduledeboot、Set scheduledeboot函数集合 发布的脚本中有一些错误导致您出现问题。第一个是nuke参数集不包含服务器参数。另一个bug就是把你甩出去的bug。您可以在上面定义$server参数,但在函数中,您可以更改档位并从文本文件加载。您混合了$server、$servers和$comp变量,导致它失败
您应该将[string]$server更改为[string[]$server,或者更好的是,[string[]$ComputerName和$ComputerName{…}中的foreach$node在集合上。将文本文件加载到该函数之外。在添加参数集之前,我只设置了一个函数,并在for循环中的同一脚本中调用了该函数,效果很好。为什么您仍然不能这样做呢?或者,您可以让服务器接受数组[String[]和/或从管道中接受其值[ParameterValueFromPipeline=$true]并使用进程{}block。我正在考虑使用Begin/Process/End,但不确定这是最有效的方法。谢谢,我会尝试一下。@user4317867在什么方面有效?在Begin/Process/End的开销开始变得明显之前,您必须处理大量服务器数百万time@MathiasR.Jessen我只是不确定如何结束这一切,但我明天会继续工作。@briantist,因为我不太确定如何将循环合并到带有参数集的函数中。在参数集之前,循环只是对每个项执行了函数调用。感谢您的输入,我承认我一直在将这些脚本组合在一起,没有太多的动力我知道。我正在清理它以备一般使用。