Как прочитать текстовый файл в переменную в пакетном режиме и передать его в качестве параметра в скрипт powershell - PullRequest
1 голос
/ 07 марта 2020

У меня есть сценарий powershell, который генерирует отчет, и я подключил его к io.filesystemwatcher. Я пытаюсь улучшить возможности обработки ошибок. У меня уже есть функция генерации отчета (которая принимает только путь к файлу) внутри try-catch l oop, которая в основном убивает word, excel и powerpoint и пытается снова, если это не удается. Кажется, это работает хорошо, но я хочу встроить еще одну попытку-ловушку l oop, которая перезагрузит компьютер и сгенерирует отчет после перезагрузки, если он выйдет из строя второй раз подряд.

Я решил попробовать и измените реестр после прочтения этой статьи: https://cmatskas.com/configure-a-runonce-task-on-windows/

Мой план будет таким: во второй попытке поймать l oop Я создам текстовый файл с именем RecoveredPath.txt с файлом путь является его единственным содержимым, а затем добавьте что-то вроде:

Set-ItemProperty "HKLMU:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name '!RecoverReport' -Value "C:\...EmergencyRecovery.bat"

Перед перезагрузкой. В пакетном файле у меня есть:

set /p RecoveredDir=<RecoveredPath.txt
powershell.exe -File C:\...Report.ps1 %RecoveredDir%

Когда я пытаюсь запустить пакетный скрипт, он не выдает никаких ошибок, но, похоже, ничего не делает. Я попытался добавить оператор echo, и он сохраняет значение текстового файла как переменную, но, похоже, не передает его правильно в powershell. Я также попытался добавить -Path% RecoveredDir%, но это привело к ошибке (параметр в report.ps1 называется $ Path).

Что я делаю неправильно?

1 Ответ

1 голос
/ 07 марта 2020

Одна потенциальная проблема заключается в том, что отсутствие %RecoveredDir% в "..." приведет к разрыву с путями, содержащими пробелы и другие специальные символы.

Тем не менее, большая проблема в том, что с использованием простого имени файла RecoveredPath.txt означает, что файл ищется в независимо от того, текущим каталогом является .

В комментарии вы указываете, что как пакетный файл, так и входной файл RecoveredPath.txt находятся в папке вашего рабочего стола.

Однако это не пакетный файл расположение, которое имеет значение, это текущий каталог процесса - и, скорее всего, не вашего рабочего стола, когда ваш пакетный файл автоматически запускается при запуске.

Учитывая, что пакетный файл и входной файл находятся в одной и той же папке 1026 * и что вы можете сослаться на полный путь к папке пакетного файла с помощью %~dp0 (который включает в себя завершающий \ ), измените ваш командный файл так, чтобы он выглядел следующим образом:

set /p RecoveredDir=<"%~dp0RecoveredPath.txt"
powershell.exe -File C:\...Report.ps1 "%RecoveredDir%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...