Я пытаюсь использовать сценарий powershell, чтобы получить словосочетание из нескольких текстовых файлов, а затем вывести его в файл csv. Это работает так, как ожидалось, когда запускается из приглашения powershell и работает при вызове из командной строки непосредственно или изнутри скрипта perl, однако скрипт не работает при вызове в качестве запланированной задачи.
Это не проблема с ExecutionPolicy, при которой сценарий не запускается вообще. Скрипт работает и производит некоторый вывод, но при запуске из планировщика задач он не может открыть какие-либо текстовые документы.
Соответствующий код powershell приведен ниже:
$folderpath = "C:\some\where\*"
$fileTypes = "*.docx"
$word = New-Object -ComObject word.application
$word.visible = $false
Get-ChildItem -path $folderpath -recurse -include $fileTypes |
foreach-object '
{
$path = ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
try {
$doc = $word.documents.open($_.fullname, $confirmConversion, $readOnly, $addToRecent, $passwordDocument)
} catch {
"FROM CATCH UNABLE TO OPEN $($_.fullname)" >> $wordCountFile
}
if($doc) {
$wordCount = $doc.ComputeStatistics("wdStatisticWords")
"$($_.name), $wordCount" >> $wordCountFile
$doc.close([ref]$false)
} else {
"UNABLE TO OPEN $($_.fullname)" >> $wordCountFile
}
} #end Foreach-Object
$word.Quit()
(Обратите внимание, что альтернативные методы, которые люди цитируют для получения количества слов из текстовых документов, фактически не возвращают правильный счет, как этот метод делает, когда он работает.)
При запуске в качестве запланированной задачи (для запуска с наивысшими привилегиями и как пользователь-администратор) с использованием:
cmd /c start PowerShell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -File "C:\path\to\script\CountsInWords.ps1"
или при запуске с подобной командой из скрипта perl, запущенного запланированной задачей (мой обычный вариант использования), и в обоих случаях задача установлена с наивысшими привилегиями, сценарий powershell работает неправильно.
Блок catch, по-видимому, никогда не был достигнут, поскольку оператор печати никогда не делает его в файл, однако $ doc всегда равен нулю.
Кроме того, при запуске в качестве задачи сценарий оставляет открытым процесс word и использует 100% -ный процессор для 1 потока, что в конечном итоге приведет к повреждению моей машины.
Обобщить:
запустить сценарий как человека (независимо от того, сколько уровней косвенности) → отлично работает
запускать скрипт из задачи (как пользователь-администратор) → запускает скрипт, но не может получить доступ к текстовым документам, также не может остановить процесс слов, несмотря на то, что всегда нажимает строку $ word.Quit.
EDIT: с советом @TheMadTechnician о первом запуске офиса для нового пользователя, требующего некоторых подробностей: при дальнейшей проверке, глядя на процессы в диспетчере задач, я не вижу словосочетания, если я не нажму “показать процессы от всех пользователей”,, но потом они появляются, но пользователь указан как я. Как процесс может быть явно указан как я, но считать другого пользователя?
Попытка установить $word.visible = $true
в скрипте фактически не $word.visible = $true
ничего, появляющегося при запуске из планировщика задач, поэтому я не знаю, как проверить, что он ждет ввода, или как передать его этому вводу как правильный пользователь, чтобы он ушел…
Возможно, вы сможете выполнить решение, указанное на вопрос ” Как запустить задачу Windows 2008 из планировщика с” взаимодействовать с рабочим столом “.
Резюме. Если у вас 64-разрядная версия Windows: создайте %SystemRoot%\SysWOW64\config\systemprofile\Desktop
. Если у вас 32-разрядная версия Windows, создайте %SystemRoot%\system32\config\systemprofile\Desktop
.