[英]How to execute a batch file from C#?
(请参阅结尾以获取解决方案)
我不认为这会很难。 我有一个命令文件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#语句现在都可以使用。我去找一本《哈利·波特》书,所以我可以从多比那里得到一些自我惩罚的想法...
或者, 您可以创建一个.bat文件 ,然后通过System.Diagnostics.Process.Start()
调用此文件。 它不会将输出重定向到控制台应用程序,但是肯定会在其中执行命令。
我为您准备了四件事 ,您可以尝试:
(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
。 如果您随后使用以下命令查找此令牌:
> 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
是否尝试启动具有自定义扩展名的文件。 通常,启用此功能。 也许在您的机器上不是吗?
您需要指定进程全名(cmd.exe)。
你应该试试
Environment.GetFolderPath(Environment.SpecialFolder.System) + "cmd.exe"
因此,即使cmd.exe在应用程序目录中,您也可以确保执行正确的文件。
您的计算机似乎出了点问题。 尝试在另一台机器上运行它。 这应该工作。 Process.Start(string)
使用ShellExecuteEx
启动文件,因此,就像您想的那样,它与在资源管理器中双击该文件几乎相同。
一个简单的测试对我有用。
@echo Hello from foo.cmd! @pause
class Program{
static void Main(){
System.Diagnostics.Process.Start("B:\\foo.cmd");
}
}
这按预期工作。
您的错误消息是可疑的,“%1不是有效的Win32应用程序。” 我在HKCR \\ cmdfile \\ shell \\ open \\ command中的注册表值是
"%1" %*
%1
被文件名替换, %*
在这里可以忽略(它表示应该传递任何其他命令行参数,但是我们现在不关心它)。
启动文件本身以处理此类文件的事实表明Windows本身知道如何启动此类文件。 在Windows的正常安装中,应类似地设置以下扩展名:
.exe
Windows和DOS可执行文件 .com
DOS“命令”文件 .bat
Windows和DOS批处理文件 .cmd
Windows NT批处理文件 .pif
Windows到DOS可执行文件的快捷方式 如果转到HKCR\\.xxx
(其中xxx
是上述任何一项),则“(默认)”值应为xxxfile
。 如果然后转到HKCR\\xxxfile\\shell\\open\\command
,则“((默认)”)值应为"%1" %*
。 此外, HKCR\\xxxfile\\shell
的“(默认)”值应该未设置或未open
。
如果这些值中还有其他任何内容,则说明某个程序已尝试将其自身插入执行过程中。 病毒有时会这样做(例如Sircam )。
您是否尝试过执行cmd.exe
并将.cmd文件作为参数传递给它?
嗯试试:
System.Diagnostics.Process myproc = new System.Diagnostics.Process();
myproc.EnableRaisingEvents=false;
myproc.StartInfo.FileName="d:\\a.cmd";
myproc.Start();
MessageBox.Show("did the command");
您是否已在目录中测试了批处理文件,并且该文件即将运行? 出现%1的错误消息似乎是问题所在?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.