【问题标题】:returning the output of a C# program called by a batch file to that batch file without using temp file read/writes将批处理文件调用的 C# 程序的输出返回到该批处理文件,而不使用临时文件读/写
【发布时间】: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#程序的步骤如下:

  1. cd 进入正确的目录
  2. 运行上面的批处理代码
  3. 检查应用程序是否按预期运行(确实如此)
  4. 观察到程序中没有任何内容被回显,甚至没有空行(FOR 循环的DO 部分似乎从未输出任何内容)

所以我的问题是:我需要使用 C# 中的什么命令来将批处理代码从我的程序中获取到echo。一旦我得到它,我就知道如何使用它,我只需要先得到它。我觉得要么,它不能完成,因为它是一个 Windows 窗体应用程序,它可以完成但我不聪明,或者读取操作发生得太快(在打印任何内容之前),因此我得到没有。我找不到批处理代码可以“读取”哪些命令的任何示例,所以我认为它与控制台输出或打印命令有关。

感谢改进问题的建议

【问题讨论】:

  • 您的for 命令正在读取start 命令的输出(无),而不是您的应用程序的输出。删除start /wait
  • 好的。很高兴知道!但是如何让脚本仍然等到应用程序完成?
  • for /f 不会执行do 子句中的代码,直到它从执行的命令中检索到所有输出,也就是说,for 将停止直到应用程序结束。跨度>
  • 嗯,这有点让我的问题毫无意义。如果您愿意,可以将其发布为您的答案,我会接受,因为我刚刚尝试过,它解决了我的问题。现在我只是觉得问了很傻
  • 这不是一个毫无意义的问题。有些事情并不明显,您的方法似乎是正确的。这使您在错误的地方搜索问题。 “不敢问,耻于学习”“傻”没有立足之地

标签: c# windows batch-file return flags


【解决方案1】:

for /f 在指定命令的输出中为每个非空行执行do 子句中的代码(另请参见for /? 输出关于eol 处理)。您的代码中的问题是正在处理的输出是 start 命令的输出(启动命令不输出任何内容),而不是您的应用程序的输出。

由于for /f 将等待执行的命令结束(do 子句中的代码在检索到所有输出之前不会执行)start /wait 不仅不需要,而且是问题。

只需从命令中删除 start /wait 即可处理应用程序的输出。

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 2013-03-11
    • 2014-03-17
    • 2013-07-19
    • 2013-08-27
    • 1970-01-01
    • 2011-10-07
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多