2016-11-15 4 views
0

Так I've получил сценарий Powershell, который проверяет, если папка была создана в определенном каталоге, а затем делает вещи с этой папкой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 { ... } выполняется.

Затем я попытался сделать партию, которая запускает скрипт PowerShell, который запускается с помощью Task (как предложено здесь 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 { ... } не выполняется.

Edit: Task Schedular установлен, чтобы запустить сценарий как пользователь с правами администратора, поскольку действия, которые не работают нужны те, запись в C: \ отлично работает

+0

Запись в корень C: диск требует повышенных привилегий. Задана ли задача запускать только при входе пользователя в систему? Если нет, то вам нужно установить учетные данные в задаче, и если папка, которую вы проверяете, является сетевым диском, вам необходимо использовать UNC-путь. – Squashman

+0

Забыл добавить это: Task Schedular установлен для запуска скрипта как пользователя с правами администратора, поскольку действия, которые не работают, нуждаются в них, запись в C: \ работает отлично. –

+1

Знаете ли вы, что 'FileSystemWatcher' умирает с процессом, в котором он был создан? – PetSerAl

ответ

0

ОК Я нашел свою ошибку

Как предложено @PetSerAl, я забыл, что FileSystemWatcher Действует только в рамках одного конкретного процесса сценария. Сценарий запустил задание успешно, но после закрытия процесса скрипта (иначе, в окне, в котором я запустил скрипт) Job сломался, потому что он больше не мог ссылаться на FileSystemWatcher.

Добавление что-то простое, как:

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

работал прекрасно

0

Запланированные действия Задача:

Программа Script (Использовать полный путь):

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