【问题标题】:Pass Powershell parameters within Task Scheduler在任务计划程序中传递 Powershell 参数
【发布时间】:2017-11-19 12:32:01
【问题描述】:
function ServiceRestart
{
    Param
    (
        $ErrorLog,
        $Services,
        $MaxSize    
    )

    $Time = Get-Date -Format 'yyyy:MM:dd HH:mm:ss'
    $Result = (Get-Item $ErrorLog).length 


    if($Result -gt $MaxSize)
    {
        Clear-Content $ErrorLog
    }

    Try 
    {
        Foreach($Service in $Services)
        {
            Restart-Service -DisplayName $Service -ErrorAction Stop
        }
    } Catch 
      {
        "ERROR: $Service could not be restarted $Time" | Add-Content $ErrorLog 
      }
}

ServiceRestart -ErrorLog -Services -MaxSize

我需要从任务计划程序中传入以下参数
- 错误日志
- 服务
- 最大尺寸

我目前有这样的任务计划程序设置
程序/脚本:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

添加参数(可选):
-Command "& \ServerName\C$\Users*****\Documents\Scripts\Scheduled-ServiceRestart.ps1
-ErrorLog 'ServerName\C$\Users *****\Documents\log\ScriptErrors.txt'
-Services 'foo1' , 'foo2'
-MaxSize '5MB'"

当我运行计划任务时,没有任何反应,可能出了什么问题。

【问题讨论】:

    标签: powershell scheduled-tasks


    【解决方案1】:

    除了 Bill 的建议之外,另一个需要注意的是任务计划程序的“常规”选项卡中的“配置:”设置。根据您的设置,它可能默认为比您正在运行的版本更早的 Windows 版本,并且对于 Server 2008,它看起来不支持向您正在调用的 .ps1 文件添加类似的参数.在尝试了这里的其他建议后,我花了一些时间来锻炼。

    例如:

    -file "c:\scripts\myscript.ps1"
    

    在任务调度器中工作正常

    .\myscript.ps1 -myparameter foo
    

    在 shell 中可以正常工作,但是:

    -file "c:\scripts\myscript.ps1" -myparameter foo
    

    在任务调度程序中运行失败,结果代码为 0xfffd0000。

    发现“Configure for:”默认为 2008,因此将其更改为 2012 R2 并解决了问题,现在运行良好。

    【讨论】:

      【解决方案2】:

      我建议调度任务使用-File 参数而不是-Command。示例:

      程序/脚本:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

      添加参数(可选):-NoProfile -ExecutionPolicy Bypass -File "Scheduled-ServiceRestart.ps1" -ErrorLog "ScriptErrors.txt" -Services "foo1","foo2" -MaxSize 5MB

      开始于(可选):C:\Users\<username>\Documents\Scripts

      您可以在任务的“开始于”属性中指定脚本的起始目录,避免脚本和日志文件的路径名过长。 (请注意,我假设您在本地计算机上运行脚本的副本,而不是通过网络,这会增加潜在的复杂性和失败的可能性。)

      【讨论】:

      • 使用 -NoProfile -ExecutionPolicy Unrestricted -File 'Scheduled-ServiceRestart.ps1' -ErrorLog '\C$\Users\\Documents\log\ScriptErrors.txt' -Services ' Service1','Service2' -MaxSize '500MB'" 我收到错误 (0xFFFD0000)。我在远程服务器上运行它,但脚本只需要在本地执行。@Bill_Stewart
      • 将脚本复制到本地服务器。
      • 我无法使用此处显示的示例,因为'Scheduled-ServiceRestart.ps1' 等参数值周围有单引号。相反,我用双引号替换了所有单引号,这解决了我的所有问题。如果在处理 Windows 命令行时发现,应该使用双引号,因为单引号仅在极少数情况下使用。
      【解决方案3】:

      显然,在使用计划任务时,引号的选择会产生巨大的差异。试试这个作为你的论点:

      -Command "& '\\ServerName\C$\Users\...\Documents\Scripts\Scheduled-ServiceRestart.ps1' -ErrorLog '\\ServerName\C$\Users\...\Documents\log\ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize '5MB'"
      

      【讨论】:

        【解决方案4】:

        就问题的字面答案而言:可能您需要在脚本位置周围添加单引号,否则它将尝试将特殊字符/反斜杠解释为转义。

        例如:

        -Command "& '\ServerName\C$\Users*****\Documents\Scripts\Scheduled-ServiceRestart.ps1' ...
        

        您还可以在您的 powershell 脚本中添加一些基本的日志记录,以确保它实际上正在启动。

        我在生产 Powershell 计划任务中使用“-Command &”样式,只要字符串格式正确,它们就可以正常工作。

        【讨论】:

          【解决方案5】:

          函数需要先导入。我建议将函数保存为模块并将其放在 system32 或程序文件的模块文件夹中。这样,当 powershell 启动时,它会自动导入你的函数。

          完成之后,任务调度器就非常简单了。

          程序/脚本

          Powershell
          

          添加参数(可选):

          -Command &{ServiceRestart -ErrorLog 'ServerName\C$\Users*****\Documents\log\ScriptErrors.txt' -Services 'foo1','foo2' -MaxSize '5MB'}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-28
            • 2010-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多