控制台应用程序是否可以知道它已从批处理文件中调用?

时间:2011-10-19 09:41:47

标签: c# batch-file console

控制台应用程序是否有办法知道是否已从批处理文件调用,而不是直接在命令提示符处调用?

询问的原因是找到一种方法来决定是否启动Console.ReadLine循环或类似于等待进一步输入,或者是否立即退出。

或者,批处理文件是否有办法继续将输入发送到等待通过ReadLine进一步输入的控制台应用程序?

是的,我知道 - 这是两个问题。如果有人评论说第二个问题有答案,我会单独询问。

4 个答案:

答案 0 :(得分:5)

为什么不将commandline argument传递给控制台应用以确定是立即退出还是等待。

答案 1 :(得分:1)

批处理文件可以设置环境变量,您可以在控制台应用程序中检查它:

批处理文件中的

set waitOnDone=0
yourExeFile -arguments
控制台应用程序中的

var env = System.Environment.GetEnvironmentVariable("waitOnDone");
if (String.IsNullOrEmpty(env) ||  env != "0")
{
    // do something
}

答案 2 :(得分:1)

如果有一个redirecton(来自你的批处理文件),你的问题可能只是从stdin读取。

这也可以通过检测是否存在输入流来解决(使用dotnet)。

来自@Hans PassantSO: how to detect if console in stdin has been redirected

的解决方案
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();
}

答案 3 :(得分:1)

如果批处理文件知道输入,则将输入保存到文件并将其提供给程序,如

prog.exe <argument.txt
批处理文件中的

。我认为您无需更改此源代码。