Может ли консольное приложение узнать, что оно было вызвано из командного файла? - PullRequest
0 голосов
/ 19 октября 2011

Есть ли способ для консольного приложения узнать, было ли оно вызвано из командного файла, а не напрямую из командной строки?

Причина запроса состоит в том, чтобы найти способ решить, следует ли инициировать цикл Console.ReadLine или аналогичный, чтобы ожидать дальнейшего ввода, или выходить немедленно.

В качестве альтернативы, есть ли способ для командного файла продолжить отправку ввода в консольное приложение, которое ожидает дальнейшего ввода через ReadLine?

Да, я знаю - это 2 вопроса. Если кто-нибудь прокомментирует, что есть ответ на второй вопрос, я задам его отдельно.

Ответы [ 4 ]

5 голосов
/ 19 октября 2011

Почему бы не передать аргумент командной строки консольному приложению, чтобы определить, следует ли выйти немедленно или подождать.

1 голос
/ 19 октября 2011

Если пакетный файл знает входные данные, сохраните входные данные в файл и передайте их в свою программу, например

prog.exe <argument.txt

в командном файле. Я думаю, вам не нужно менять исходный код для этого.

1 голос
/ 19 октября 2011

Возможно, ваша проблема - читать только из стандартного ввода, если есть перенаправление (из вашего пакетного файла).

Это также может быть решено (с помощью dotnet) путем определения наличия входного потока.

Решение от @ Hans Passant , SO: как определить, была ли перенаправлена ​​консоль в stdin

using System.Runtime.InteropServices;

public static class ConsoleEx
{
    public static bool OutputRedirected
    {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout)); }
    }
    public static bool InputRedirected
    {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin)); }
    }
    public static bool ErrorRedirected
    {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stderr)); }
    }

    // P/Invoke:
    private enum FileType { Unknown, Disk, Char, Pipe };
    private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
    [DllImport("kernel32.dll")]
    private static extern FileType GetFileType(IntPtr hdl);
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetStdHandle(StdHandle std);
}

И его можно использовать вот так

if (ConsoleEx.InputRedirected)
{
  string strStdin = Console.In.ReadToEnd();
}
1 голос
/ 19 октября 2011

Пакетный файл может установить переменную среды, и вы можете проверить это в своем консольном приложении:

в командном файле:

set waitOnDone=0
yourExeFile -arguments

в вашем консольном приложении:

var env = System.Environment.GetEnvironmentVariable("waitOnDone");
if (String.IsNullOrEmpty(env) ||  env != "0")
{
    // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...