Назад | Перейти на главную страницу

Запланированная задача для запуска 32-разрядного сценария PowerShell с тремя аргументами

Версия TLDR

Мне нужно запустить 32-разрядный сценарий PowerShell, который принимает три аргумента в качестве запланированной задачи в Windows Server 2008 R2. Сценарий запускает FileSystemWatcher, поэтому мне нужно поддерживать его в рабочем состоянии, чтобы он мог продолжать собирать новые файлы.

Вам, вероятно, стоит посмотреть на материал в разделе «Аргументы» ниже, если вы просматриваете.

Задний план

Я создал сценарий PowerShell, который отлично работает из консоли PowerShell x86 на моем компьютере с Windows Server 2008 R2. Он создает FileSystemWatcher и регистрирует действие для события создания файла. Поскольку мне нужен FileSystemWatcher, чтобы продолжать наблюдение, мне нужно, чтобы PowerShell продолжал работать, а не выходил сразу после запуска скрипта:

Сценарий принимает три аргумента:

  1. Путь к папке для просмотра
  2. Путь к папке, в которую будут перемещаться любые новые файлы .xlsx и записываться выходной текстовый файл на основе содержимого файла .xlsx.
  3. Путь к файлу журнала.

Однако я не могу заставить скрипт правильно работать как запланированное задание. Я думаю, что проблема в аргументах, которые я использую, но я не знаю, какие аргументы были бы правильными.

Настроить

Поскольку мне нужно, чтобы сценарий запускался в 32-разрядной оболочке PowerShell, я установил программу запланированной задачи на% SystemRoot% \ syswow64 \ WindowsPowerShell \ v1.0 \ powershell.exe.

Я обязательно установил Политика исполнения в RemoteSigned для локального компьютера в 32-разрядной оболочке PowerShell.

Аргументы

Я пробовал несколько разных вариантов своих аргументов. Следующий запуск в консоли, но каким-то образом не удается Диспетчер задач:

Задача выполняется, но не записывается в файл журнала, что указывает на то, что она, вероятно, даже не запустила FileSystemWatcher. В любом случае, он не подхватывает файлы при их создании:

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\" "\\someserver.domain.edu\D$\working_directory\" "\\otherServer\share\folder\my_log.txt"

Задача завершается с кодом 0xFFFD0000 (см. Последний результат 0xFFFD0000 для запланированной задачи Powershell). Я уверен, что задача выполняется от имени соответствующей учетной записи службы, у которой есть доступ к общим сетевым ресурсам, используемым в аргументах.

powershell -Noexit -File 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\someserver.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'

Эти варианты даже не работают в консоли (даже не делайте первую запись в журнал):

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"
powershell -Noexit -command {"& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"}

На основе блог Scripting Guys, Я подумал, что мне стоит попробовать -Command аргумент вместо -File. Эти два варианта запускают Наблюдатель файловой системы в консоли и записывают соответствующее сообщение в файл журнала, но они не собирают файлы при создании:

powershell -Noexit -command "& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"
powershell -Noexit -command "& D:\Scripts\myScript.ps1 \\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"

Код

Поскольку сценарий работает в консоли, я почти уверен, что проблема не в самом коде. Тем не менее, вот некоторые важные части из самого скрипта для тех, кто не будет удовлетворен, если не увидит код. :)

Создайте FileSystemWatcher

Function startWatcher ($onFolder) {
    try {
        #Create a file watcher
        $filter = "*.xlsx"
        $fsWatcher = New-Object IO.FileSystemWatcher $onFolder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
        $fileWatcherStartDate = (Get-Date -format M.d.yyyy.HH.mm.ss).Tostring()
        log($fileWatcherStartDate)
        log "Started file system watcher on $onFolder for $filter files.`r`n"
        return $fsWatcher
    }
    catch {
        handleError("Error starting file system watcher")
    }
}

Событие создания регистрации

Function registerCreationEvent ($watcher) {
    log "Attempting to register creation event..."
    try {
        Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
            try {
                #Code to read from Excel file, create an output text file from the 
                #content, and move both to the specified working directory.
            }
            catch {
                handleError("Performing main action on individual file.")
            }
        }
        log "Event creation registered."
    }
    catch {
        handleError("Error registering creation event")
    }
}

Клянусь Джорджем, я думаю, что понял!

В конечном итоге я вернулся к тому, как я изначально запускал его в консоли (то есть с точечный поиск), но добавили флаг -Noexit впереди:

Программа: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe

Аргументы: -Noexit . D:\Scripts\myScript.ps1 \\otherserver\share\folder\subfolder\ \\server.domain.edu\D$\working_dir\ \\otherserver\share\folder\my_log.txt