- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 MSBuild 任务执行(除其他外)对 xcopy 的调用。我发现,当我从一个批处理文件运行我的 MSBuild 任务时,对 xcopy 的调用正确执行,并且无法执行或产生任何输出,这些输出让我知道当从另一个批处理文件调用同一个批处理文件时发生了什么带有 System.Diagnostics.Process 的 C# 应用程序。
两个进程都以大致相同的结构启动:
waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;
此外,通过将 xcopy 命令上的“UseShellExecute”从 false 更改为 true,我可以在这两个用例中成功,但该命令在第三个用例中无法运行。第三个用例是我们的自动构建系统,它是一个直接调用 msbuild 的 Windows 服务。如果我们的构建机器出现故障,复制命令将无限期挂起,我相信这是因为 System.Diagnostics.Process 试图显示一个窗口,而服务没有与之关联的 Windows 桌面 session ,因此它们不能显示窗口。
我试过使用“CreateNoWindow”属性,我试过将“WindowStyle”设置为“ProcessWindowStyle.Hidden”,但这不会改变构建机器上的行为。
综上所述,我真正想知道的是 UseShellExecute 属性到底做了什么,因为它似乎比 MSDN 文档建议的要多得多。
谢谢。
最佳答案
ProcessStartInfo.UseShellExecute告诉进程使用 Windows Shell 来执行指定的应用程序。
没有这个设置,只能直接执行一个EXE文件。通过设置此项,您允许使用 Windows Shell,它允许执行诸如指定 .doc 文件和让相关程序打开该文件等操作。
但是,使用 Windows Shell 需要有效的桌面上下文,这就是您的第三个用例失败的原因。
一般来说,除非您使用的是 Windows Shell,否则使用 cmd.exe
是有问题的。您可能只想编写代码来直接处理您的“批处理”操作 - 即:使用 System.IO namespace 中类型的方法做你的复制。这将完全避免这个问题。
关于c# - System.Diagnostics.Process UseShellExecute 究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374153/
我正在从我的 IIS Web 应用程序中启动一个小型控制台应用程序。代码是从应用程序池中使用这样的代码启动的, Process process = new Process(); ProcessStar
所以这是我的问题: 我已经启动了一个 .bin 文件,它只是一个 .exe,重命名为 .bin,具有管理员权限。 这是我的: PSI.FileName = "Client.bin"; PSI.Work
我有一个程序,基本上剩下的就是通过 CMD.exe 调用命令。 我需要在我当前的工作目录中打开 CMD.exe(我知道我可以做 Porcess.Start(CMD.exe)) 然后我需要让程序在 cm
ProcessStartInfo.UseShellExecute 将如何影响我正在运行的进程? 我是否需要 UAC 的特殊权限才能使用 UseShellExecute? 它会在不同的用户上运行吗? 它
我想启动一个具有提升权限但隐藏窗口的子进程(实际上是相同的控制台应用程序)。 我接下来要做的是: var info = new ProcessStartInfo(Assembly.GetEntryAs
在找出为什么某些应用程序可以运行我的应用程序(即 Minecraft 启动器)时遇到一些困难,它创建了一个 .bat 文件并使用 UseShellExecute 运行它。不确定是因为 UAC 垃圾还是
我想使用 shell 可执行文件以尊重要启动的应用程序的用户首选项,但我还需要知道该特定应用程序何时关闭。 Process editProcess = new Process(); ProcessSt
我正在开发一个使用 Process API 生成子进程的应用程序,并将 UseShellExecute 设置为 false。这个问题是我不想去寻找我正在生成的进程,因为它们在我的系统路径中可用。例如,
我有一个 MSBuild 任务执行(除其他外)对 xcopy 的调用。我发现,当我从一个批处理文件运行我的 MSBuild 任务时,对 xcopy 的调用正确执行,并且无法执行或产生任何输出,这些输出
// // Summary: // Gets or sets a value indicating whether to use the operating system shell //
如果我编写一个控制台应用程序,将另一个控制台应用程序作为一个新进程启动,并使用默认的“UseShellExecute”和“CreateNoWindow”值,结果是控制台应用程序窗口旁边会出现一个新的命
我需要从我的 UWP 应用程序调用批处理文件。方法似乎是 Process.Start(),但它说当我按照它输出的路径时,它甚至找不到文件,它确实存在。当使用 shellexecute = false
版本 dotnet 核心 SDK:2.1.403 docker :18.09.7 Linux 内核:5.0.0-27 Ubuntu:18.04.3 问题 我正在 docker 中运行一个 ASP.NE
我想从一个控制台运行多个 .Net Core 控制台应用程序。我有以下代码: var startInfo = new ProcessStartInfo("c:\path\to\file
我是一名优秀的程序员,十分优秀!