针对C:\Documents and Settings\Owner\My Documents\My Pictures\201.html
重点是改进代码的可读性。
function CaptureStdout(FileName: string):String;
function Helper_CreatePipe(var hReadPipe:THandle; var hWritePipe :THandle):Boolean;
var lsa: SECURITY_ATTRIBUTES;
begin
lsa.nLength := sizeof(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor := nil;
lsa.bInheritHandle := True;
Result := CreatePipe(hReadPipe, hWritePipe, @lsa, 0) ;
end;
function Helper_CreateProcess(filename:string; hWritePipe:THandle ;var pi: PROCESS_INFORMATION):Boolean;
var
si: STARTUPINFO;
fname: PChar;
begin
fname := allocmem(1024);
fillchar(si, sizeof(STARTUPINFO), 0);
si.cb := sizeof(STARTUPINFO);
si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
si.wShowWindow := SW_HIDE;
si.hStdOutput := hWritePipe;
si.hStdError := hWritePipe;
StrPCopy(fname, FileName);
Result := CreateProcess(nil, fname, nil, nil, true, 0, nil, nil, si, pi);
end;
procedure Helper_ReadToStrings(hReadPipe:THandle; var line : String;pi:PROCESS_INFORMATION);
var cchReadBuffer: DWORD;
ph: PChar;
begin
ph := AllocMem(1024);
while (true) do
begin
if not PeekNamedPipe(hReadPipe, ph, 1, @cchReadBuffer, nil, nil) then break;
if cchReadBuffer <> 0 then
begin
if ReadFile(hReadPipe, ph^, 512, cchReadBuffer, nil) = false then break;
ph[cchReadbuffer] := chr(0);
line := line + ph ;
end
else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then break;
Application.ProcessMessages;
Sleep(200);
end;
ph[cchReadBuffer] := chr(0);
line := line + ph ;
FreeMem(ph);
end;
var
line: String;
hReadPipe, hWritePipe: THandle;
pi: PROCESS_INFORMATION;
begin
try
if not Helper_CreatePipe(hReadPipe, hWritePipe) then
Exit;
if not Helper_CreateProcess(Filename,hWritePipe, pi) then
Exit;
Helper_ReadToStrings(hReadPipe, line ,pi);
Result := line ;
finally
CloseHandle(hWritePipe);
CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
end;
procedure TestCaptureStdout ;
const
filename = 'c:\test.bat';
begin
with TStringList.Create do
try
Add('@echo off');
Add('Echo abc');
Add('Echo def');
savetofile(filename);
if 'abc'#13#10'def'#13#10 = CaptureStdout(filename) then
ShowMessage('OK')
else
ShowMessage('Not OK');
finally
Free;
DeleteFile(filename) ;
end;
end;
分享到:
相关推荐
标题 "在Delphi中运行DOS命令" 涉及的是如何在Delphi编程环境中执行控制台(DOS)命令。Delphi是一个基于Object Pascal语言的集成开发环境(IDE),它提供了丰富的功能来与操作系统进行交互,其中之一就是执行外部...
DosCommand 的主要功能是调用操作系统内置的 DOS 命令,比如 `dir`、`copy`、`ping` 等,并且能够捕获这些命令的控制台输出。这对于需要与操作系统交互或者自动化某些任务的应用程序来说非常有用。例如,开发者可以...
然后,它读取进程的标准输出,直到没有更多数据可读。最后,关闭所有相关的句柄。 在项目文件中,`Project1.dpr`是项目的主程序文件,`Unit1.pas`和`Unit1.dfm`分别包含了程序的逻辑代码和界面设计。`Unit1.dcu`是...
5. 处理命令输出:如果你需要捕获DOS命令的输出,你需要设置`STARTUPINFO`结构体的`hStdOutput`、`hStdError`和`hStdInput`字段,指向你的自定义管道或内存缓冲区,这样命令的输出就会被重定向到这些位置。...
4. **命令输出**:DOS命令的输出可能包含标准输出和错误输出,模块应能区分并处理这两种输出。 5. **安全性**:在调用DOS命令时,要避免执行可能导致系统安全风险的命令,例如执行任意的外部程序或者操作敏感文件。...
// 重定向标准输出 using (Process process = Process.Start(psi)) { string output = process.StandardOutput.ReadToEnd(); Console.WriteLine(output); // 输出命令结果 } } ``` 上述代码中,`"cmd.exe"`是...
这可能涉及到读取命令的标准输出和标准错误流。 4. **输出显示**:程序可能将捕获的回执信息以某种形式展示给用户,比如在易语言的窗口程序中显示文本,或者写入日志文件。 5. **示例命令**:源码中可能包含一些...
总结来说,Visual C++中调用DOS命令并获取返回信息主要通过`CreateProcess`函数来实现,配合使用管道或内存缓冲区来捕获输出信息。这种方式可以更好地控制命令执行的过程,适用于复杂的需求。而`system`函数则适用于...
解决这个问题的方法是使用`Process`类来捕获并处理子进程的标准输出。例如,你可以创建一个`BufferedReader`来读取`getInputStream()`,并逐行打印出来,如示例所示,这样可以清空标准输出缓冲区,避免阻塞。 4. **...
在这个文件中,可能会有函数或过程用于启动DOS命令,捕获输出,以及与用户界面交互的部分。 - DosVcl.res则是Delphi的资源文件,它包含了应用程序的图标、字符串、菜单等资源,这些资源在程序运行时会被加载到内存中...
在执行DOS命令时,可能会有标准输出和标准错误输出。为了防止数据丢失,我们需要读取并处理这些输出流。例如: ```java BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream...
当命令执行后,通常会产生标准输出和错误输出。这些可以通过Process对象的`getInputStream()`和`getErrorStream()`方法获取。例如: ```java BufferedReader stdout = new BufferedReader(new InputStreamReader...
下面将详细阐述如何在C#中执行DOS命令以及相关的知识点。 首先,导入System.Diagnostics命名空间,这是执行DOS命令的基础: ```csharp using System.Diagnostics; ``` 然后,创建一个ProcessStartInfo对象,设置...
在编程领域,有时候我们需要在应用程序中执行操作系统级别的任务,例如执行DOS命令。这个主题主要涉及到进程控制和系统调用,这些是操作系统提供给应用程序与系统交互的接口。本示例将详细介绍如何在Windows环境下...
综上所述,要实现“执行DOS命令捕捉CMD实时输出,不显示CMD窗口”的功能,你需要编写一个批处理脚本,利用`start /b`参数启动命令并捕获输出到文件。同时,如果需要实时查看输出,可以结合其他命令或使用PowerShell...
无论使用哪种方法,获取DOS命令返回结果的关键在于理解如何启动外部进程、捕获其输出以及处理这些输出。在处理结果时,需要注意编码问题,因为不同操作系统或程序可能使用不同的字符编码。 总的来说,掌握取DOS命令...
3. **读取输出**:在DOS命令执行过程中,其输出会通过标准输出流(stdout)和标准错误流(stderr)传递。易语言中,可以使用`读取管道数据`或`读取文件`命令来获取这些数据,作为命令的回执。 4. **错误处理**:...
通过设置`RedirectStandardInput`、`RedirectStandardOutput`和`RedirectStandardError`属性为`true`,我们可以控制`cmd.exe`的标准输入和捕获其标准输出与错误输出。最后,通过`Start`方法启动进程,向其输入命令并...
二、捕获DOS命令输出 `xp_cmdshell`执行的命令结果默认会打印到SQL Server的错误日志中。如果我们需要将这些结果保存到数据库表中,可以结合其他T-SQL语句进行操作。例如,创建一个临时表来存储结果: ```sql ...
例如,DOS命令的输出会包含文件名、大小、日期等信息,这些信息可以通过字符串处理函数进行解析。 易语言提供了丰富的字符串处理函数,如`字符串.分割`、`字符串.查找`等,可以方便地将DOS命令的输出按行、按空格或...