Мне нужно запустить 32-разрядный сценарий PowerShell, который принимает три аргумента в качестве запланированной задачи в Windows Server 2008 R2. Сценарий запускает FileSystemWatcher, поэтому мне нужно поддерживать его в рабочем состоянии, чтобы он мог продолжать собирать новые файлы.
Вам, вероятно, стоит посмотреть на материал в разделе «Аргументы» ниже, если вы просматриваете.
Я создал сценарий PowerShell, который отлично работает из консоли PowerShell x86 на моем компьютере с Windows Server 2008 R2. Он создает FileSystemWatcher и регистрирует действие для события создания файла. Поскольку мне нужен FileSystemWatcher, чтобы продолжать наблюдение, мне нужно, чтобы PowerShell продолжал работать, а не выходил сразу после запуска скрипта:
Сценарий принимает три аргумента:
Однако я не могу заставить скрипт правильно работать как запланированное задание. Я думаю, что проблема в аргументах, которые я использую, но я не знаю, какие аргументы были бы правильными.
Поскольку мне нужно, чтобы сценарий запускался в 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"
Поскольку сценарий работает в консоли, я почти уверен, что проблема не в самом коде. Тем не менее, вот некоторые важные части из самого скрипта для тех, кто не будет удовлетворен, если не увидит код. :)
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