问题标签 [console.setout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
347 浏览

.net-2.0 - 如何确保获取和设置操作的原子性以重定向 Console.Out 以记录控制台输出?

我需要拦截控制台输出流以便将其捕获为日志,但仍将内容传递给原始流,以便应用程序正常工作。这显然意味着在将原始Console.OutTextWriter 更改为Console.SetOut(new MyTextWriterClass(originalOut)).

我假设获取 Out 属性和调用 SetOut() 方法的各个操作Console是以线程安全的方式实现的。但我想确保其他一些线程(例如,运行我无法控制且无法更改的客户端应用程序代码,因此我不能依赖我自己的自定义锁定方案)不能在我的 get 和 set 之间意外更改它,最终被我对它的更改覆盖(破坏了他们的应用程序的行为!)。由于其他代码可能只是调用 SetOut(),因此我的代码理想情况下应该获得内部使用的相同锁Console(假设有一个)。

不幸的是,Console是一个(静态)类,而不是一个实例,所以你不能只是lock (Console). 在类文档中查看似乎没有提到锁定。这不是这些 Console 方法的通常预期用法,但应该有一些安全的方法来作为原子操作执行此操作。

如果标准锁定方案失败,是否有其他方法可以确保这一点?对于如此短的关键部分(并且只完成一次),即使是暂时阻塞所有其他线程也是可以接受的,如果这是唯一的方法的话。我们正在使用 C# 和 .NET2.0。

如果这甚至不可能(不中断客户端应用程序),那么我们将不得不依赖它,客户端应用程序不太可能重定向其控制台输出碰巧在我们的 get 和 set 操作之间进行。我只想覆盖所有的基础,以防万一。

编辑:现在我们有了示例代码的具体答案,我已经改写了问题标题,以更普遍地反映答案可以提供帮助的用例,更清楚。此外,还为“原子”添加了一个标签。

0 投票
4 回答
7303 浏览

c# - Console.SetOut 到 StreamWriter,不断写入文本文件

我正在使用 Console.SetOut 方法将我的所有 Console.Out.WriteLines 写入文件,这很有效。唯一的问题是它只在我关闭应用程序时将所有内容写入文本文件,而不是在 Console.Out.WriteLine 发生时写入。关于如何实现这一点的任何想法?

我是怎么做的:在 Application.Run(); 之前

在 Application.Run() 之后:

谢谢。

0 投票
1 回答
386 浏览

c# - 在 C# 中运行 Psexec.exe 时如何捕获 %ERRORLEVEL%,保存到日志文件

我正在使用 psexec.exe 在大量计算机上安装一些软件。我希望能够捕获 %ERRORLEVEL% (或其等效的 c#)并将它们写入 TXT 文件。( cmd.exe 在 6440-nbpb00f51w 上退出,错误代码为 0。)

经过广泛的研究,我发现了几种可能性。我的最终目标是拥有一个 .CSV 文件。每行都有计算机名称和 psexec 命令的输出。使用这些数据,我将能够确定更新在哪些计算机上成功。

我不是在这里找人为我编写代码。我在这里向人们征求他们的建议或过去的经验。我知道有几种不同的方法可用。理想情况下,我希望每个结果都有一个简短的甜蜜线,但如果我必须获取整个输出并使用宏将它们缩减为更易读的形式,那也很好。

到目前为止,我已经尝试过:

和...

和...

在我看来,最后一个是最好的,但似乎无法让它发挥作用。我已经尝试将它包含在我的 foreach 循环中,但是文件正在被另一个进程使用,所以在查看它之后我发现它需要独立。即使单独使用它,我仍然无法让它工作。

请帮助/建议!

通过使用以下命令,即使没有添加任何内容,我也能够让它实际修改我的 TXT 文件:

0 投票
1 回答
777 浏览

.net - .NET Console.WriteLine() Console.SetOut

我编写了一个程序来遍历一个固定文件并插入一个 | 在需要的地方,该程序可以正常工作并正确显示在控制台中。问题是我无法从控制台获取该行以写入文件中的一行。所有尝试都以一个空文件或将一行的每个字符串写成单独的行结束。下面的代码显示了应该将输出写入文件但文件为空白的代码。

0 投票
1 回答
1200 浏览

c# - System.ObjectDisposedException:“无法写入已关闭的 TextWriter。” 设置输出错误

我正在编写一个程序,它可以查看文件夹中的所有文件,然后将控制台输出写入一个新的 txt 文件,但是当我在写入 1 行后运行程序时,它会产生一个错误说

System.ObjectDisposedException:“无法写入已关闭的 TextWriter。”

这是代码: