gpt4 book ai didi

pascal - 使用 Pascal 的 Windows 命令行

转载 作者:行者123 更新时间:2023-12-02 08:44:39 24 4
gpt4 key购买 nike

我正在尝试在一个简短的 Pascal 程序中使用一些 Windows 命令行工具。为了使它更容易,我正在编写一个名为 DoShell 的函数,它接受命令行字符串作为参数,并返回一个名为 ShellResult 的记录类型,其中一个字段用于进程的退出代码,一个字段用于进程的输出文本。

我遇到了一些主要问题,一些标准库函数无法按预期工作。 DOS Exec() 函数实际上并未执行我传递给它的命令。 Reset() 过程会给我一个运行时错误 RunError(2),除非我设置编译器模式 {I-}。在这种情况下,我不会收到运行时错误,但我之后在该文件上使用的 Readln() 函数实际上不会读取任何内容,此外,在代码执行中的该点之后使用的 Writeln() 函数也不会执行任何操作。

这是到目前为止我的程序的源代码。我正在使用 Lazarus 0.9.28.2 beta,带有 Free Pascal Compiler 2.24


program project1;

{$mode objfpc}{$H+}

uses
Classes, SysUtils, StrUtils, Dos
{ you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

type
ShellResult = record
output : AnsiString;
exitcode : Integer;
end;

function DoShell(command: AnsiString): ShellResult;
var
exitcode: Integer;
output: AnsiString;
exepath: AnsiString;
exeargs: AnsiString;
splitat: Integer;
F: Text;
readbuffer: AnsiString;
begin
//Initialize variables
exitcode := 0;
output := '';
exepath := '';
exeargs := '';
splitat := 0;
readbuffer := '';
Result.exitcode := 0;
Result.output := '';

//Split command for processing
splitat := NPos(' ', command, 1);
exepath := Copy(command, 1, Pred(splitat));
exeargs := Copy(command, Succ(splitat), Length(command));

//Run command and put output in temporary file
Exec(FExpand(exepath), exeargs + ' >__output');
exitcode := DosExitCode();

//Get output from file
Assign(F, '__output');
Reset(F);
Repeat
Readln(F, readbuffer);
output := output + readbuffer;
readbuffer := '';
Until Eof(F);

//Set Result
Result.exitcode := exitcode;
Result.output := output;

end;

var
I : AnsiString;
R : ShellResult;
begin
Writeln('Enter a command line to run.');
Readln(I);
R := DoShell(I);
Writeln('Command Exit Code:');
Writeln(R.exitcode);
Writeln('Command Output:');
Writeln(R.output);
end.

最佳答案

快速浏览一下,我发现您尝试根据空间分割命令。如果:

  • 我尝试执行不带参数的操作,例如 fpc? (答案:exepath将为空)
  • 我尝试执行带有完整路径且包含空格的内容,例如 C:\Program Files\Edit Plus 3\editplus.exe

我尝试了 Exec() ,当您为其提供要运行的可执行文件的完整路径时,它似乎可以工作,但输出重定向不起作用。看:Command line redirection is performed by the command line interpreter 。但是,您可以执行执行重定向的 .bat 文件(使用用户提供的命令创建临时 .bat 文件 + 重定向,然后运行该批处理)。

关于pascal - 使用 Pascal 的 Windows 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com