InstallScript не может прочитать текстовый файл, содержащий результат из командной строки

Я пишу функцию Installscript для запуска команды в командной строке, перенаправляю результат из консоли в текстовый файл, а затем читаю текстовый файл для получения информации.

// send command method
STRING szCmdPath, szCmdLine ;
szCmdPath = "C:\\WINDOWS\\system32\\cmd.exe";
szCmdLine = "/c wslconfig /l > D:\\output.txt";
LaunchAppAndWait(szCmdPath, szCmdLine, WAIT);

метод отправки команды не запускал команду с szCmdLine, как я хотел, он не смог распознать команду и выдал следующую ошибку:

«wslconfig» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

Однако, если я запускаю cmd.exe вручную вместо использования моего скрипта, он отлично выполняет команду. Что не так с моим скриптом и как исправить эти проблемы? Спасибо всем заранее.


person Thế Long    schedule 26.04.2018    source источник
comment
wslconfig не находится в пути по умолчанию в моей Windows 10 Pro. В переменной пути может отсутствовать любой путь, который был добавлен для ручного запуска cmd.exe во время работы InstallShield. У MSI тоже есть такие причуды,   -  person Dave S    schedule 26.04.2018
comment
хорошо, я включил функцию Windows Sub System для Linux, таким образом, разрешив wslconfig.exe в той же папке, что и cmd.exe: C:\WINDOWS\system32 Я что-то пропустил? не могли бы вы объяснить причуды MSI, пожалуйста? Я очень ценю это.   -  person Thế Long    schedule 26.04.2018
comment
Я бы добавил полный путь к wslconfig, чтобы убрать его из картины при устранении неполадок.   -  person Doc    schedule 26.04.2018
comment
Я последовал вашему предложению, но результат все тот же. Я заметил, что единственный способ запустить wslconfig — из командной строки. Прямой запуск wslconfig.exe вообще ничего не дает.   -  person Thế Long    schedule 27.04.2018


Ответы (1)


Я вижу здесь два потенциально запутанных элемента. Одним из них является перенаправление файловой системы 32-разрядных процессов (что приводит к загрузке 32-разрядного cmd.exe, который не может найти wslconfig). Другой вопрос заключается в том, будет ли обработка командной строки перенаправления вывода делать то, что вы хотите.

Чтобы проверить, вот некоторые вещи, которые вы можете попробовать:

  • Запустите тест из явно 32-разрядной командной строки (c:\Windows\SysWow64\cmd.exe)
  • Запустите другую команду, например cmd /c echo got-it > D:\output.txt

Я подозреваю, что вам, возможно, придется обратиться к обоим, но я твердо верю, что 32-битный контекст проблематичен. Чтобы учесть контекст, рассмотрите возможность изменения кода следующим образом, используя WINSYSDIR64:

...
szCmdPath = WINSYSDIR64 ^ "cmd.exe";
...
Disable(WOW64FSREDIRECTION);
LaunchAppAndWait(...)
Enable(WOW64FSREDIRECTION);

(В качестве альтернативного подхода вы можете использовать C:\Windows\Sysnative из 32-разрядного контекста для доступа к 64-разрядной папке без отключения WOW64FSREDIRECTION. К сожалению, нет переменной, заполненной этим путем, поэтому вам закодируйте этот путь.)

Чтобы решить проблему потенциального перенаправления вывода, рассмотрите возможность заключения аргументов /c в кавычки:

...
szCmdLine = "/c \"wslconfig /l > D:\\output.txt\"";
...
person Michael Urman    schedule 30.04.2018
comment
Это действительно проблема, и ваш ответ просто спас меня. Огромное спасибо. - person Thế Long; 02.05.2018
comment
Однако я столкнулся с другой проблемой: как мне потом прочитать файл с помощью Installscript? Ни GetLine(), ни ListReadFromFile() не работают, хотя я открыл файл в FILE_MODE_NORMAL (режим только для чтения). Но когда я вручную открываю, редактирую и сохраняю файл вручную, мой скрипт может нормально читать файл. Кажется, что после запуска командной строки указатель файла указывал на конец файла. Это вызывает еще одну путаницу: разве FILE_MODE_NORMAL не предполагает установку указателя файла в начале файла? Ваше предложение высоко ценится. - person Thế Long; 02.05.2018
comment
Что касается последней проблемы (чтение текстового файла после запуска командной строки), кто-то предположил, что поток или файл могут быть открыты, поэтому я не могу прочитать файл из своего сценария. Но OpenFile() вообще не возвращал ошибок. Есть ли способ это проверить/исправить? - person Thế Long; 02.05.2018
comment
Если ваш код аналогичен примеру OpenFile, я бы не ожидал проблем с позицией в файле; они не сохраняются при открытии файлов, а тем более в отдельных процессах. Возможно, новые строки в файле необычны? Для большего количества глаз вы должны задать это как новый вопрос. - person Michael Urman; 02.05.2018
comment
Я уже разместил вопрос с подробностями, надеюсь, вы можете взглянуть и сказать мне, что вы думаете. Спасибо за совет. ссылка - person Thế Long; 03.05.2018