将批处理文件调用的 C# 程序的输出返回到该批处理文件而不使用临时文件 read/writes
returning the output of a C# program called by a batch file to that batch file without using temp file read/writes
我在做什么
第一部分描述了为什么我认为这个问题不是重复的。我正在尝试将 C# windows 表单应用程序的一些输出批量转换为变量。但是有一些注意事项。由于这个项目的要求(它是为了工作),我不能让临时文件简单地从 C# 写入并从批处理中读取。这是因为它会给整个应用程序带来安全风险,这是不可接受的。另一个警告是 C# 程序是使用 START /WAIT
命令从批处理文件调用和启动的。需要澄清的是,我不是这段代码的唯一作者,我编写了其中的很大一部分,对其进行了调试和单元测试,但这段代码并不完全是我的。因此 "just refactor it and use something easier" 不是开发这么晚的选项。该代码按其意图运行良好,我只需要解决这个问题。这些注意事项,以及 C# 程序不是控制台应用程序而是 windows 表单应用程序这一事实,使我相信这个问题不是关于该主题的其他问题的重复。这是因为我了解如何让 batch 尝试读取程序输出(其他问题是关于什么的),但我不明白要在 C# 程序中放入什么才能让 batch 成功读取它(我的问题)。
申请的目的是什么?
我不会详细说明,因为这可能不合法,但 C# 程序和批处理程序的目的基本上是通过配置各种 [=55] 为我们的网络服务设置 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# main class 中尝试了 Console.Writeline("something")
,但是当我通过批处理代码 运行 程序时,它没有引起任何回应。我很确定批处理代码是正确的,因为它 运行 应用程序。
我对运行C#程序采取的步骤如下:
- cd 到正确的目录
- 运行上面的批处理代码
- 检查应用程序 运行 的完整性是否符合预期(它确实如此)
- 观察程序没有回显任何内容,甚至没有空行(
FOR
循环的 DO
部分似乎从未输出任何内容)
所以我的问题是:我需要使用 C# 中的什么命令来获取批处理代码 echo
从我的程序中提取一些东西。我知道如何使用字符串,一旦我得到它,我只需要先得到它。我觉得要么,它不能完成,因为它是一个 windows 表单应用程序,它可以完成,但我不聪明,或者读取操作发生得太快(在打印任何东西之前)因此我什么也得不到。我找不到批处理代码可以执行哪些命令的任何示例 'read' 所以我假设它与控制台输出或打印命令有某种关系。
欢迎提出改进问题的建议
for /f
为指定命令的输出中的每个非空行执行 do
子句中的代码(另请参阅 for /?
输出关于 eol
处理) .您的代码中的问题是正在处理的输出是 start
命令的输出(启动命令不输出任何内容),而不是您的应用程序的输出。
由于 for /f
将等待执行的命令结束(do
子句中的代码在检索到所有输出之前不会执行),因此 start /wait
不是只是不需要,而是问题的根源。
只需从命令中删除 start /wait
即可处理应用程序的输出。
我在做什么
第一部分描述了为什么我认为这个问题不是重复的。我正在尝试将 C# windows 表单应用程序的一些输出批量转换为变量。但是有一些注意事项。由于这个项目的要求(它是为了工作),我不能让临时文件简单地从 C# 写入并从批处理中读取。这是因为它会给整个应用程序带来安全风险,这是不可接受的。另一个警告是 C# 程序是使用 START /WAIT
命令从批处理文件调用和启动的。需要澄清的是,我不是这段代码的唯一作者,我编写了其中的很大一部分,对其进行了调试和单元测试,但这段代码并不完全是我的。因此 "just refactor it and use something easier" 不是开发这么晚的选项。该代码按其意图运行良好,我只需要解决这个问题。这些注意事项,以及 C# 程序不是控制台应用程序而是 windows 表单应用程序这一事实,使我相信这个问题不是关于该主题的其他问题的重复。这是因为我了解如何让 batch 尝试读取程序输出(其他问题是关于什么的),但我不明白要在 C# 程序中放入什么才能让 batch 成功读取它(我的问题)。
申请的目的是什么?
我不会详细说明,因为这可能不合法,但 C# 程序和批处理程序的目的基本上是通过配置各种 [=55] 为我们的网络服务设置 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# main class 中尝试了 Console.Writeline("something")
,但是当我通过批处理代码 运行 程序时,它没有引起任何回应。我很确定批处理代码是正确的,因为它 运行 应用程序。
我对运行C#程序采取的步骤如下:
- cd 到正确的目录
- 运行上面的批处理代码
- 检查应用程序 运行 的完整性是否符合预期(它确实如此)
- 观察程序没有回显任何内容,甚至没有空行(
FOR
循环的DO
部分似乎从未输出任何内容)
所以我的问题是:我需要使用 C# 中的什么命令来获取批处理代码 echo
从我的程序中提取一些东西。我知道如何使用字符串,一旦我得到它,我只需要先得到它。我觉得要么,它不能完成,因为它是一个 windows 表单应用程序,它可以完成,但我不聪明,或者读取操作发生得太快(在打印任何东西之前)因此我什么也得不到。我找不到批处理代码可以执行哪些命令的任何示例 'read' 所以我假设它与控制台输出或打印命令有某种关系。
欢迎提出改进问题的建议
for /f
为指定命令的输出中的每个非空行执行 do
子句中的代码(另请参阅 for /?
输出关于 eol
处理) .您的代码中的问题是正在处理的输出是 start
命令的输出(启动命令不输出任何内容),而不是您的应用程序的输出。
由于 for /f
将等待执行的命令结束(do
子句中的代码在检索到所有输出之前不会执行),因此 start /wait
不是只是不需要,而是问题的根源。
只需从命令中删除 start /wait
即可处理应用程序的输出。