控制檯應用程序是否有方法知道它是否從批處理文件調用,而不是直接在命令提示符下調用?控制檯應用程序能否知道它是從批處理文件中調用的?
詢問的原因是找到一種方法來決定是否啓動Console.ReadLine循環或類似的操作來等待進一步的輸入,或者是否立即退出。
另外,有沒有辦法批量文件繼續發送輸入到控制檯應用程序,該應用程序正在等待通過ReadLine進一步輸入?
是的,我知道 - 這是2個問題。如果有人評論說第二個問題有答案,我會單獨提出。
控制檯應用程序是否有方法知道它是否從批處理文件調用,而不是直接在命令提示符下調用?控制檯應用程序能否知道它是從批處理文件中調用的?
詢問的原因是找到一種方法來決定是否啓動Console.ReadLine循環或類似的操作來等待進一步的輸入,或者是否立即退出。
另外,有沒有辦法批量文件繼續發送輸入到控制檯應用程序,該應用程序正在等待通過ReadLine進一步輸入?
是的,我知道 - 這是2個問題。如果有人評論說第二個問題有答案,我會單獨提出。
批處理文件可以設置一個環境變量,您可以檢查您的控制檯應用程序:
set waitOnDone=0
yourExeFile -arguments
在控制檯應用程序
:
var env = System.Environment.GetEnvironmentVariable("waitOnDone");
if (String.IsNullOrEmpty(env) || env != "0")
{
// do something
}
一旦你編輯它,這個工作;-) – rohancragg
接受,因爲它恰好是我決定使用的解決方案。其他答案也是有效的。謝謝。 – rohancragg
可能你的問題是隻讀標準輸入,如果有一個redirecton(從你的批處理文件)。
這也可以通過檢測是否有輸入流來解決(使用dotnet)。
解決方案從@Hans Passant,SO: 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();
}
SO需要提供署名,您不能只複製答案而不提供指向作者個人資料的鏈接和答案鏈接。 –
我試過這個,但是我似乎無法生成ConsoleEx.InputRedirected爲真的情況?批處理文件包含MyApp.exe -arg測試 – rohancragg
@Hans Passant:你說得對,但我從我的來源複製這個,我找不到原來的SO鏈接 – jeb
如果批處理文件知道那麼輸入的輸入保存到一個文件和飼料,爲你的程序中使用像
prog.exe <argument.txt
在批處理文件中。我認爲你不需要爲此改變源代碼。
批處理文件是否已知輸入或用戶需要以交互方式輸入? – ferosekhanj
批處理文件已知道所需的輸入 – rohancragg