如何从 C# 运行 .cmd 文件,其中包含多行代码
Posted
技术标签:
【中文标题】如何从 C# 运行 .cmd 文件,其中包含多行代码【英文标题】:How to Run a .cmd file from C# which has multiple lines of code inside it 【发布时间】:2020-10-17 01:12:49 【问题描述】:当我尝试执行 cmd 时,cmd 中的代码没有被执行。我希望当我执行 cmd 时,它应该运行其中的代码并执行操作。当我双击 cmd 文件时,整个过程都很好地完成了。但是通过c#,cmd文件里面的代码并没有执行。
static void Main(string[] args) var proc = new Process(); proc.StartInfo.FileName = @"D:\Dump\createAndDump.cmd"; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); 字符串输出 = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); var exitCode = proc.ExitCode; proc.Close();
cmd 有以下代码要执行: 这将连接到工具并完成设备的闪烁。 我正在执行上述代码,但它无法执行 cmd 文件中的行。
@echo connect> flash.mtb
@for %%i in (*.s11) do (
@echo open_file "%%~fi">> flash.mtb
@echo select_all_sections>> flash.mtb
@echo add_selected_sections>>flash.mtb
)
@echo program>> flash.mtb
@echo disconnect>> flash.mtb
@echo exit>> flash.mtb
for %%j in (flash.mtb) do "C:\Program Files (x86)\xyz\Memtool 4.7\IMTtool.exe" %%~dpj%%~nxj
【问题讨论】:
到底发生了什么,这与您的预期有何不同?您在调试代码时获得了哪些信息? 你应该在标题中写下你的具体问题。假装你在和一个忙碌的同事交谈,你应该用一句话总结你的问题,然后写下标题。 当我尝试执行 cmd 时,cmd 中的代码没有被执行。我希望当我执行 cmd 时,它应该运行其中的代码并执行操作。当我双击 cmd 文件时,整个过程都很好地完成了。但是通过c#,cmd文件里面的代码并没有执行。 请将您的评论添加到您的问题正文中,并将标题更改为特定问题 似乎您的C#
代码应该定义WorkingDirectory
,或者您的.cmd
代码应该从定义它开始,(%~dp0
)。
【参考方案1】:
Obs.:路径/代码\xyz\
中的字符串,可以编辑为\RealNameFolder\
。有必要吗?
考虑:
-
您的
*.s11
文件位于 Dump
文件夹中:
D:
|
\---Dump
0001.s11
0005.s11
0010.s11
0015.s11
-
创建
flash.mtb
文件的文件夹是\Dump
D:
|
\---Dump
0001.s11
0005.s11
0010.s11
0015.s11
flash.mtb
createAndDump.cmd
文件位于\Dump
文件夹的前一层:
D:
|
| createAndDump.cmd
|
\---Dump
C#
可执行文件和 createAndDump.cmd
位于同一文件夹中:
D:
| createAndDump.cmd
| RunBat.exe
|
\---Dump
-
使用下面建议的c#代码来获取运行可执行文件的工作目录,并使用它来尝试调用bat:
string pathdir = Directory.GetCurrentDirectory();
var process = new Process();
var startinfo = new ProcessStartInfo(Path.Combine(pathdir, "createAndDump.cmd"));
-
您能否尝试使用建议的 c# 代码向您发出信号(生成 bat 输出),这样更容易检查什么你有错,无论是在你的c#,还是在你的bat的执行?
process.OutputDataReceived += (sender, argsx) => <b>Console.WriteLine(argsx.Data)</b>;
c# 代码:
using System;
using System.IO;
using System.Diagnostics;
namespace ConsoleApplication
class Program
static void Main(string[] args)
string pathdir = Directory.GetCurrentDirectory();
var process = new Process();
var startinfo = new ProcessStartInfo(Path.Combine(pathdir, "createAndDump.cmd"));
startinfo.RedirectStandardOutput = true;
startinfo.UseShellExecute = false;
process.StartInfo = startinfo;
process.OutputDataReceived += (sender, argsx) => Console.WriteLine(argsx.Data);
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
cmd# 代码:
您可以尝试使用cd /d "%~dp0"
,也可以使用默认的Program files
(ProgramFiles
, ProgramFiles(x86)
, %ProgramW6432%
) 文件夹,尝试查找并获取 \Memtool.exe
文件的完整路径:
@echo off && setlocal EnableDelayedExpansion
cd /d "%~dp0" && pushd .\Dump && >"%~dp0Dump\flash.mtb" (
echo\connect && for %%i in (*.s11)do echo\open_file "%%~fi" && echo\select_all_sections && echo\add_selected_sections
echo\program && echo\disconnect && echo\exit ) || echo. Yes, something is very wrong here... && endlocal && goto :EOF
popd && (for %%i in (ProgramFiles,ProgramFiles(x86^),ProgramW6432)do if /i defined %%~i 2>nul (for /f tokens^=^* %%M in ('
%__APPDIR__%where.exe /r "!%%~i!\xyz\Memtool 4.7" "IMTtool.exe"')do echo/%%M|%__APPDIR__%findstr.exe /ei xe>nul && (
pushd "!%%~i!\xyz\Memtool 4.7" && "!%%~i!\xyz\Memtool 4.7\%%~nxM" "%~dp0Dump\flash.mtb" && endlocal && goto :EOF )))
【讨论】:
@AutoEng bat 是否在您拥有*.s11
文件的同一文件夹中调用?
这也是我发现的一个问题。由于我的项目很大并且带有遗留问题,编译器在进行调试时在一个特定文件夹中搜索 s11 文件,我认为它位于解决方案箱内的调试文件夹中(默认),但查找文件的代码已完成很久以前就被一些开发人员硬编码(不知道为什么:P)。这只是问题所在,您和我的 shell 脚本都在将文件放入文件夹后工作。谢谢。 :) 很高兴看到您提出问题并回答了这一点,否则我的问题只得到-1,没有答案。大声笑:D
@AutoEng 寻求帮助建议,第一点理解或问题,这里有一些人会很容易地帮助你,但是在理解问题时有些困难导致投票失败以上是关于如何从 C# 运行 .cmd 文件,其中包含多行代码的主要内容,如果未能解决你的问题,请参考以下文章