如何从 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) =&gt; <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 文件,其中包含多行代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 执行 .SQL 脚本文件

如何使用c#在cmd中运行命令[重复]

R:从文本文件运行多行 sql

如何让C#中listview控件显示多行多列数据?

从 C# 方法,如何调用和运行 DLL,其中 DLL 名称来自 String 变量?

从代码执行 CMD 命令