(解决方法见文末)
我不认为这会很难。我有一个命令文件 d:\a.cmd,其中包含:
copy /b d:\7zS.sfx + d:\config.txt + d:\files.7z d:\setup.exe
但这些 C# 行不会执行它:
Process.Start("d:\\a.cmd");
Process.Start("cmd", "/c d:\\a.cmd");
抛出 Win32Exception:“%1 不是有效的 Win32 应用程序。”
Process.Start 打开 .pdf 文件...为什么不执行命令文件?
如果我在 cmd 窗口中输入它,这会起作用:
cmd /c d:\a.cmd
Windows XP、MS Visual Studio 2008。
提前致谢, 吉姆
解决方案 我只是有点尴尬 :( 在我的应用程序目录中有一个名为 cmd.exe 的文件,大小为零。我不知道它是如何到达那里的,但现在它已经完蛋了,上面的两个 C# 语句现在都可以工作了。我是去找一本哈利波特的书,这样我就可以从多比那里得到一些 self 惩罚的想法......
最佳答案
我为您准备了四件事,您可以尝试一下:
(1) 尝试提供 cmd.exe
的完整路径(例如在我的机器上:C:\WINDOWS\SYSTEM32\CMD.EXE
).
(2) 尝试在要执行的命令中添加call
:
Process.Start(@"C:\WINDOWS\SYSTEM32\CMD.EXE", @"/c call D:\a.cmd");
(3) 除此之外,我只能猜测 Win32Exception
中的 %1
是从哪里来的。也许您的文件关联设置不正确。
如果您在命令行中键入以下内容:
> assoc .cmd
您可能会提到 cmdfile
。如果您随后使用以下方式查找此 token :
> ftype cmdfile
您可能会得到如下答案:
cmdfile="%1" %*
这些设置存储在注册表中,这就是命令行解释器知道如何执行具有自定义扩展名的文件的方式。 (你可以通过对.pdf
扩展名执行以上两条语句来了解一个PDF文档是如何启动的。)
(4) 如果您开始怀疑您的机器可能配置错误,请启动 regedit
(注册表编辑器)并找到注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
.
在我的 Windows XP 机器上(您的 Process.Start
示例在我的机器上运行,但文件名不同),我在其中存储了以下值:
// Name Type Value
// -----------------------------------------------
// (standard) REG_SZ (not set)
// AutoRun REG_SZ
// CompletionChar REG_DWORD 0x00000040 (64)
// DefaultColor REG_DWORD 0x00000000 (0)
// EnableExtensions REG_DWORD 0x00000001 (1)
// PathCompletionChar REG_DWORD 0x00000040 (64)
其中,AutoRun
值可能会引起一些兴趣。我认为它对应于cmd.exe
的/d
命令行开关,控制cmd.exe
是否尝试以自定义方式启动文件扩展。通常,这是启用的。也许,在你的机器上,它不是?
关于c# - 如何从 C# 执行批处理文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026888/