c# - 如何从 C# 执行批处理文件?

标签 c# process batch-file

(解决方法见文末)

我不认为这会很难。我有一个命令文件 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/

相关文章:

c# - 如何创建可重用的 Entity Framework 投影表达式?

c# - monoDevelop ubuntu c# Class List 没有 elementAt 方法

c++ - 我们如何将一个位置的 RVA(相对虚拟地址)映射到 PE 文件偏移量?

java - runtime.exec 参数中有空格

batch-file - 等待命令终止

python - 用于访问另一个目录中的 python 脚本的通用批处理命令

c# - C# 中 XML 元素的元素/属性注释

c# - JWT 和 Windows 身份验证的 ASP.Net Core 2.0 混合身份验证不接受凭据

c# - 启动命令行,包括来自 C# 的参数

windows - 我应该如何将密码(包含特殊字符)作为命令行参数传递?