【问题标题】:Powershell Script started by Task Scheduler not working任务计划程序启动的 Powershell 脚本不起作用
【发布时间】:2016-11-15 14:10:15
【问题描述】:

所以我有一个 powershell 脚本,它检查是否在特定目录中创建了一个文件夹,然后对该文件夹进行处理

代码:

echo "$(Get-Date -Format g) - Script started" >> C:\bitlocker.log

$folder = 'C:\Path\To\Check'

$filter = '*.*'           

$fsw = New-Object IO.FileSystemWatcher $folder, $filter 
$fsw.IncludeSubdirectories = $false              
$fsw.NotifyFilter = [IO.NotifyFilters]'DirectoryName' 

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 

   $folderNow = $($EventArgs.FullPath)
   <do stuff now>

}

手动启动此脚本完美无缺,但使用任务计划程序运行它不起作用。

首先我尝试直接启动脚本,这表明脚本已成功启动,但-Action { ... } 没有执行任何操作。

然后我尝试创建一个批处理来启动由 Task 启动的 powershell 脚本(如此处建议的How to run a PowerShell script from a batch file

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\PathtoScript\Script.ps1""' -Verb RunAs}"

但问题还是一样。

脚本启动(将一些输出写入文件以检查),但 -Action { ... } 内部没有任何内容被执行。

编辑:任务计划设置为以具有管理员权限的用户身份运行脚本,因为不起作用的操作需要这些操作,写入 C:\ 工作得很好

【问题讨论】:

  • 写入 C: 驱动器的根目录需要提升的权限。任务是否设置为仅在用户登录时运行?如果不是,那么您需要在任务中设置凭据,如果您检查的文件夹是网络驱动器,则需要使用 UNC 路径。
  • 忘了添加:任务计划设置为以具有管理员权限的用户身份运行脚本,因为不工作的操作需要这些,写入 C:\ 工作得很好。
  • 你知道FileSystemWatcher 在创建它的过程中死掉了吗?
  • @PetSerAl - 手动执行时,脚本会启动一个后台作业“FileCreated”来处理其余部分。脚本本身在启动作业后停止,但作业无休止地运行(或直到手动停止)并且完全按照我的意愿运行。 Entering Get-Job 运行脚本后直接显示未运行的 Job。当现在编写一个字典时,Job 将其状态更改为正在运行并成功处理设置的操作
  • @MartinFischer 手动执行是什么意思?是不是:您启动交互式 PowerShell process,在该交互式 process 中执行脚本,然后等待交互式 PowerShell process 仍在运行?如果是,那么当您关闭此交互过程时会发生什么?您是否继续接收事件?

标签: powershell batch-file scheduled-tasks


【解决方案1】:

计划任务操作:

程序脚本(使用完整路径):

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

添加参数([NOT]可选):

-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\PathtoScript\Script.ps1" -Any 'other' -arguments 'you need' -should follow

【讨论】:

    【解决方案2】:

    好的,我发现我的错误

    正如@PetSerAl 所建议的那样,我忘记了FileSystemWatcher 仅在脚本的那个特定过程的范围内起作用。脚本已成功启动作业,但在关闭脚本进程(也就是我启动脚本的窗口)后,作业崩溃了,因为它不能再引用 FileSystemWatcher

    添加一些简单的东西,例如:

    Do{
        $JobExist = Get-Job 
    } while($JobExist -ne '')
    

    工作得很好

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 1970-01-01
      • 2017-07-06
      • 2023-02-07
      • 2020-05-02
      • 2019-06-18
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多