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

问题描述:

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

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

另外,有没有办法批量文件继续发送输入到控制台应用程序,该应用程序正在等待通过ReadLine进一步输入?

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

+0

批处理文件是否已知输入或用户需要以交互方式输入? – ferosekhanj

+0

批处理文件已知道所需的输入 – rohancragg

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

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

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

一旦你编辑它,这个工作;-) – rohancragg

+0

接受,因为它恰好是我决定使用的解决方案。其他答案也是有效的。谢谢。 – rohancragg

在批处理文件

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

+0

好的建议 - 我想到了,如果没有其他选择,我会这样做。 – rohancragg

可能你的问题是只读标准输入,如果有一个redirecton(从你的批处理文件)。

这也可以通过检测是否有输入流来解决(使用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(); 
} 
+2

SO需要提供署名,您不能只复制答案而不提供指向作者个人资料的链接和答案链接。 –

+0

我试过这个,但是我似乎无法生成ConsoleEx.InputRedirected为真的情况?批处理文件包含MyApp.exe -arg测试 – rohancragg

+0

@Hans Passant:你说得对,但我从我的来源复制这个,我找不到原来的SO链接 – jeb

如果批处理文件知道那么输入的输入保存到一个文件和饲料,为你的程序中使用像

prog.exe <argument.txt 

在批处理文件中。我认为你不需要为此改变源代码。