возвращение вывода программы C #, вызванной пакетным файлом, в этот пакетный файл без использования чтения / записи временного файла - PullRequest
0 голосов
/ 05 декабря 2018

что я делаю

В этом первом разделе описывается, почему я считаю, что этот вопрос не является дубликатом.Я пытаюсь получить некоторый вывод приложения форм C # windows в переменную в пакетном режиме.Однако есть несколько предостережений.Из-за требований этого проекта (он предназначен для работы) я не могу сделать временные файлы для простой записи в C # и чтения из пакета.Это потому, что это представляет угрозу безопасности для всего приложения, и это недопустимо.Другое предостережение заключается в том, что программа C # вызывается и запускается из командного файла с помощью команды START /WAIT.Чтобы уточнить, я не единственный автор этого кода, я сделал большую его часть, отладил и протестировал ее, но этот код не полностью мой.Таким образом, «просто рефакторинг и использование чего-то более легкого» не является опцией в этой стадии разработкиКод хорошо работает по своему предназначению, мне просто нужно решить эту проблему.Эти предостережения, а также тот факт, что программа C # НЕ является консольным приложением, а является приложением для форм Windows, заставляет меня поверить, что этот вопрос не является дубликатом других вопросов по этой теме.Это потому, что я понимаю, как получить пакет, чтобы попытаться прочитать выходные данные программы (о чем были другие вопросы), но я не понимаю, что добавить в программу C #, чтобы пакет мог успешно читать (мой вопрос).

Для чего нужно приложение?

Я не буду вдаваться в подробности, потому что это, вероятно, не законно, но цель программы C # и пакетной программы в основном состоит в настройке машин Windows для нашегосетевой сервис, настраивая различные параметры Windows.часть C # необходима для паролей, что невозможно сделать в пакетном режиме, потому что в переменной нет способа иметь пароли специальных символов (пакетный режим интерпретирует их как команды, а не литералы, и нет простого способа обойти это).Поскольку наши пользователи должны иметь специальные символы в своих паролях, мы не можем использовать пакет для этой части программы.Проблема в том, что мне нужно знать, когда программа C # внезапно закрывается.Как форма окна, она имеет красную опцию X, которую можно выбрать до установки пароля.Пакетный файл должен знать, была ли программа C # закрыта досрочно, чтобы он мог сообщить пользователю предупреждение о том, что пароль не был установлен.Проблема в том, что я не могу понять, как получить вывод из приложения C # в пакет для отображения этого предупреждения.Если я не могу пометить условие предупреждения, я не могу отобразить предупреждение.

мое исследование

Я нашел этот вопрос: Назначить вывод программы переменной

Что дает мне хорошую отправную точку.Однако вместо общего вызова приложения я использовал команду start, поскольку хотел, чтобы пакетный файл ожидал, прежде чем он продолжится с остальной частью процесса.Мой пакетный код при запуске из CLI (предположим, я нахожусь в каталоге исполняемого файла) выглядит так:

FOR /F "tokens=*" %A IN ('start /WAIT "" "<TheApplicationName>.exe"') DO (echo output line: "%A")

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

Проблема в том, что я не могу понять, какую команду в C # мне нужно выполнить, чтобы получить что-то для чтения из приведенного выше пакетного кода.Я пробовал Console.Writeline("something") в своем главном классе C #, но это не вызвало ничего, что могло бы вылиться, когда я запустил программу через пакетный код.Я уверен, что пакетный код правильный, потому что он запускает приложение.

Шаги для запуска программы на C # следующие:

  1. cd в правильный каталог
  2. , запустите указанный выше пакетный код
  3. убедитесь, что приложение работает в полном объеме, как и должно (*) 10 *
  4. Обратите внимание, что ничего из программы не выводится, даже пустая строка (часть DO цикла FORкажется, ничего не выводится)

Итак, мой вопрос заключается в следующем: какую команду в C # мне нужно использовать, чтобы получить пакетный код для echo ЧТО-ТО из моей программы.Я знаю, как использовать строку, как только получу ее, мне просто нужно сначала ее получить.Я чувствую, что либо это невозможно, потому что это приложение Windows Form, это можно сделать, но я просто не умен, или что операция чтения происходит слишком быстро (до того, как что-либо напечатано), и, таким образом, я получаюничего такого.Я не могу найти примеров того, какие команды пакетный код может «прочитать», поэтому я предположил, что это как-то связано с выводом на консоль или командами печати. ​​

Предложения по улучшению вопроса приветствуются

1 Ответ

0 голосов
/ 05 декабря 2018

for /f выполняет код в предложении do для каждой непустой строки (см. Также for /? вывод об обработке eol) в выводе указанной команды.Проблема в вашем коде состоит в том, что обрабатываемые выходные данные - это команда start (команда start ничего не выводит), а не выходные данные вашего приложения.

Поскольку for /f будет ожидать завершения выполненной команды(код в предложении do не выполняется до тех пор, пока не будут получены все выходные данные) start /wait не только не требуется, но и вызывает проблемы.

Просто удалите start /wait изкоманда для обработки вывода приложения.

...