我有一个winform程序,内部会调用一个叫 A.exe 的程序。这个A.exe 的程序内部又会执行一个B.bat 的批处理文件。但是每次执行 B.bat 文件的时候,都会报如下错误。
System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件。在 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
但是我双击运行 A.exe ,又没有问题。
我查阅了一下,说是权限问题,但是我的winform,A.exe 都是设置的以管理员身份运行,并且在代码里面运行 A,exe 程序的时候,也是按照网上给的写法:
pro.StartInfo.FileName = filePath;
pro.StartInfo.UseShellExecute = true;
pro.StartInfo.CreateNoWindow = true;
pro.StartInfo.Verb = "runas";
return pro.Start();
但就是不行。有大佬指点一下吗?
winform 和 A.exe 都是 .net framework 4.6.1
这里推荐你附加进程调试
我自己 按照你的逻辑 亲自试了一下,解决的办法是,设置一下工作路径就行了
设置一下 WithWorkingDirectory,这个要用绝对路径
感谢楼上两个大哥,我终于搞好了。
首先,我的winform 和 A.exe 都是 ,net framework 4.6.1
其次,我的winform之前是这样写的:
pro.StartInfo.FileName = filePath;
pro.StartInfo.UseShellExecute = true;
pro.StartInfo.CreateNoWindow = true;
A.exe 是这样写的:
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.FileName = "xxxx.bat";
表现是:双击A.exe时,xxxx.bat 可以正常运行。但是通过winform调用A.exe时,xxxx.bat 执行的时候报错:
System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件。在 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
最终的解决办法是: 把 winform 和 A.exe 的 pro.StartInfo.UseShellExecute 都设置成 false
但是我不理解的是,UseShellExecute 这个字段的值,.net framework 下默认就是 true,也就是说,虽然我的 A.exe 没有设置,但是也是 true 啊。为啥非要把 winform 和 A.exe 都设置成false才行呢。。。两边都是 true 为啥就不行呢。。。
我们也做过A.exe 调用B.exe,然后把只是我们把A、B放在同级目录下,然后所需的资源也在相同目录下,通过相对路径实现调用
自己回复自己吧,又研究了一下,核心问题就是路径问题。
A.exe 是这样写的:
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.FileName = "xxxx.bat";
双击A.exe运行时,Environment.CurrentDirectory 拿到的是 A.exe 的 路径。
但是通过 form 运行 A.exe 时,拿到的是 form 的路径。所以运行 xxxx.bat 时就找不到文件了。