使用带有 for 循环的 ParamSets 的 PowerShell 函数
PowerShell Function using ParamSets with a for loop
我整理了一个 powershell 函数来安排服务器重启。
我一直在为使用 ParameterSetName 的多服务器功能添加 for loop
到 运行。
在添加 ParamSets 之前,我只是设置了一个函数并在 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.
创建 3 个(或更多)不同的函数。该参数设置您使用它的方式 over-complicating 它并使您难以调试它。
我会做一个 Get-ScheduledReboot
、Clear-ScheduledReboot
、Set-ScheduledReboot
collection 的函数。
发布的此脚本中存在一些错误,这些错误会导致您出现问题。首先是nuke参数集不包含server参数。另一个错误是让你失望的错误。您在上面定义了一个 $server 参数,但在函数中,您改变了齿轮并从文本文件加载。您将 $server
、$servers
和 $comp
变量混合在一起导致它失败。
您应该将 [string]$server
更改为 [string[]]$server
或更好,[string[]$ComputerName
和 collection 上的 foreach($node in $ComputerName){...}
。保持文本文件在该函数之外加载。
我整理了一个 powershell 函数来安排服务器重启。
我一直在为使用 ParameterSetName 的多服务器功能添加 for loop
到 运行。
在添加 ParamSets 之前,我只是设置了一个函数并在 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.
创建 3 个(或更多)不同的函数。该参数设置您使用它的方式 over-complicating 它并使您难以调试它。
我会做一个 Get-ScheduledReboot
、Clear-ScheduledReboot
、Set-ScheduledReboot
collection 的函数。
发布的此脚本中存在一些错误,这些错误会导致您出现问题。首先是nuke参数集不包含server参数。另一个错误是让你失望的错误。您在上面定义了一个 $server 参数,但在函数中,您改变了齿轮并从文本文件加载。您将 $server
、$servers
和 $comp
变量混合在一起导致它失败。
您应该将 [string]$server
更改为 [string[]]$server
或更好,[string[]$ComputerName
和 collection 上的 foreach($node in $ComputerName){...}
。保持文本文件在该函数之外加载。