【发布时间】: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