【发布时间】:2018-12-05 16:40:11
【问题描述】:
我在做什么
第一部分描述了为什么我认为这个问题不是重复的。我正在尝试将 C# windows 窗体应用程序的一些输出批量转换为变量。然而,有一些警告。由于这个项目的要求(它是为了工作),我不能制作临时文件来简单地从 C# 写入并从批处理中读取。这是因为它会给整个应用程序带来安全风险,这是不可接受的。另一个需要注意的是,C# 程序是使用START /WAIT 命令从批处理文件调用和启动的。澄清一下,我不是这段代码的唯一作者,我做了很大一部分,对其进行了调试和单元测试,但这段代码并不完全是我的。因此,“只是重构它并使用更容易的东西”并不是开发后期的选择。该代码适用于它的意图,我只需要解决这个问题。这些注意事项,以及 C# 程序不是控制台应用程序而是 Windows 窗体应用程序这一事实,让我相信这个问题与该主题的其他问题不重复。这是因为我了解如何获取批处理以尝试读取程序输出(其他问题是关于什么的),但我不明白在 C# 程序中放入什么以允许批处理成功读取它(我的问题)。
申请的目的是什么?
我不会详细介绍,因为这可能不合法,但 C# 程序和批处理程序的目的基本上是通过配置各种 windows 选项来为我们的网络服务设置 windows 机器。密码需要 C# 部分,这不能批量完成,因为没有办法在变量中包含特殊字符密码(批量将它们解释为命令而不是文字,并且没有简单的方法解决这个问题)。由于要求我们的用户能够在其密码中包含特殊字符,因此我们不能对程序的该部分使用批处理。问题是我需要知道 C# 程序何时突然关闭。作为一个windows窗体,它有红色的X选项,可以在设置密码之前选择。批处理文件需要知道 C# 程序是否提前关闭,以便向用户报告未设置密码的警告。问题是我不知道如何将 C# 应用程序的输出批量化以显示该警告。如果我不能标记警告条件,我就不能显示警告。
我的研究
我发现了这个问题:Assign output of a program to a variable
这给了我一个很好的起点。然而,我没有一般地调用应用程序,而是使用了start 命令,因为我希望批处理文件在继续执行其余过程之前等待。从 CLI 运行时我的批处理代码(假设我在可执行文件的目录中)是这样的:
FOR /F "tokens=*" %A IN ('start /WAIT "" "<TheApplicationName>.exe"') DO (echo output line: "%A")
显然,在批处理脚本中需要添加额外的百分号,但对于 CLI 本身来说这很好。
问题是我无法弄清楚我需要在 C# 中执行什么命令才能让上述批处理代码读取某些内容。我已经在我的 C# 主类中尝试了Console.Writeline("something"),但是当我通过批处理代码运行程序时它没有引起任何回声。我很确定批处理代码是正确的,因为它确实运行了应用程序。
我运行C#程序的步骤如下:
- cd 进入正确的目录
- 运行上面的批处理代码
- 检查应用程序是否按预期运行(确实如此)
- 观察到程序中没有任何内容被回显,甚至没有空行(
FOR循环的DO部分似乎从未输出任何内容)
所以我的问题是:我需要使用 C# 中的什么命令来将批处理代码从我的程序中获取到echo。一旦我得到它,我就知道如何使用它,我只需要先得到它。我觉得要么,它不能完成,因为它是一个 Windows 窗体应用程序,它可以完成但我不聪明,或者读取操作发生得太快(在打印任何内容之前),因此我得到没有。我找不到批处理代码可以“读取”哪些命令的任何示例,所以我认为它与控制台输出或打印命令有关。
感谢改进问题的建议
【问题讨论】:
-
您的
for命令正在读取start命令的输出(无),而不是您的应用程序的输出。删除start /wait -
好的。很高兴知道!但是如何让脚本仍然等到应用程序完成?
-
for /f不会执行do子句中的代码,直到它从执行的命令中检索到所有输出,也就是说,for将停止直到应用程序结束。跨度> -
嗯,这有点让我的问题毫无意义。如果您愿意,可以将其发布为您的答案,我会接受,因为我刚刚尝试过,它解决了我的问题。现在我只是觉得问了很傻
-
这不是一个毫无意义的问题。有些事情并不明显,您的方法似乎是正确的。这使您在错误的地方搜索问题。 “不敢问,耻于学习”“傻”没有立足之地
标签: c# windows batch-file return flags