下面我将详细介绍几种主要的方法,从最简单到最灵活,并提供完整的代码示例。

(图片来源网络,侵删)
使用 ParamStr 和 ParamCount 函数 (最常用)
这是最直接、最基础的方法,适用于所有 Delphi 应用程序(VCL, FMX, 控制台),这两个函数在 System 单元中定义。
ParamCount: Integer: 返回命令行参数的个数。注意:这个计数不包括可执行文件本身。ParamStr(Index: Integer): string: 返回指定索引的命令行参数。ParamStr(0)总是返回可执行文件的完整路径(C:\MyApp\MyApp.exe)。ParamStr(1)返回第一个参数。ParamStr(2)返回第二个参数,以此类推。- 如果索引超出范围,
ParamStr返回一个空字符串。
示例代码
创建一个新的 VCL 窗口应用程序或控制台应用程序,在主窗体的 OnCreate 事件或控制台程序的 begin..end 块中添加以下代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
ParamList: string;
begin
// 清空 Memo 内容
Memo1.Lines.Clear;
Memo1.Lines.Add('命令行参数分析:');
// ParamCount 返回参数的个数(不包括程序名)
Memo1.Lines.Add('----------------------------------------');
Memo1.Lines.Add('参数总数: ' + IntToStr(ParamCount));
Memo1.Lines.Add('----------------------------------------');
// ParamStr(0) 总是返回可执行文件的路径
Memo1.Lines.Add('程序路径: ' + ParamStr(0));
Memo1.Lines.Add('');
// 循环遍历所有参数
if ParamCount > 0 then
begin
Memo1.Lines.Add('所有参数列表:');
for i := 1 to ParamCount do
begin
Memo1.Lines.Format('参数 %d: "%s"', [i, ParamStr(i)]);
end;
end
else
begin
Memo1.Lines.Add('没有提供任何参数。');
end;
// 将所有参数组合成一个字符串,方便处理
ParamList := '';
for i := 1 to ParamCount do
begin
if ParamList <> '' then
ParamList := ParamList + ' '; // 用空格分隔
ParamList := ParamList + ParamStr(i);
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('组合后的参数字符串: ' + ParamList);
end;
end.
如何测试:
-
编译程序,假设生成
C:\Project1.exe。
(图片来源网络,侵删) -
打开命令提示符 (CMD) 或 PowerShell。
-
执行以下命令:
C:\Project1.exe /user:admin /password:1234 "这是一个带空格的参数"
-
运行程序,你会看到窗体上的
TMemo显示如下内容:命令行参数分析: ---------------------------------------- 参数总数: 3 ---------------------------------------- 程序路径: C:\Project1.exe 所有参数列表: 参数 1: "/user:admin" 参数 2: "/password:1234" 参数 3: "这是一个带空格的参数" 组合后的参数字符串: /user:admin /password:1234 "这是一个带空格的参数"
使用 TCommandLineParser 类 (功能强大,推荐)
对于复杂的命令行参数(例如带有开关、命名参数、开关值等),手动解析 ParamStr 会变得很麻烦,Delphi 提供了 System.CmdLine 单元中的 TCommandLineParser 类,它能极大地简化解析过程。
TCommandLineParser 可以定义参数的规则,然后自动帮你解析。
示例代码
我们使用上面的例子,但改用 TCommandLineParser 来处理。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
System.CmdLine; // 引入 CmdLine 单元
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Parser: TCommandLineParser;
UserParam, PassParam: string;
HelpSwitch: Boolean;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('使用 TCommandLineParser 解析:');
// 创建解析器实例
Parser := TCommandLineParser.Create;
try
// 定义参数规则
// 1. /u 或 --user 后面必须跟一个值
Parser.AddSwitch('u', 'user', '指定用户名', True, UserParam);
// 2. /p 或 --password 后面必须跟一个值
Parser.AddSwitch('p', 'password', '指定密码', True, PassParam);
// 3. /h 或 --help 是一个开关,后面不跟值
Parser.AddSwitch('h', 'help', '显示帮助信息', False, HelpSwitch);
// 开始解析命令行
// 如果解析失败(例如格式错误),Parse 会返回 False
if not Parser.Parse then
begin
Memo1.Lines.Add('错误: 命令行参数格式不正确。');
Memo1.Lines.Add(Parser.ErrorText); // 获取具体的错误信息
Exit;
end;
// 检查帮助开关
if HelpSwitch then
begin
Memo1.Lines.Add('帮助信息:');
Memo1.Lines.Add('用法: Project1.exe [/u:<用户名>] [/p:<密码>] [/h]');
Exit;
end;
// 输出解析结果
Memo1.Lines.Add('----------------------------------------');
if UserParam <> '' then
Memo1.Lines.Add('用户名: ' + UserParam)
else
Memo1.Lines.Add('用户名: 未提供');
if PassParam <> '' then
Memo1.Lines.Add('密码: ' + PassParam)
else
Memo1.Lines.Add('密码: 未提供');
// 获取所有未命名的参数(位置参数)
if Parser.Unnamed.Count > 0 then
begin
Memo1.Lines.Add('未命名参数:');
for var i := 0 to Parser.Unnamed.Count - 1 do
begin
Memo1.Lines.Add(' ' + Parser.Unnamed[i]);
end;
end;
finally
// 释放解析器对象
Parser.Free;
end;
end;
end.
如何测试:
- 编译程序。
- 在命令行中执行:
C:\Project1.exe /u:admin /p:1234
- 程序输出:
使用 TCommandLineParser 解析: ---------------------------------------- 用户名: admin 密码: 1234 - 执行帮助命令:
C:\Project1.exe /h
- 程序输出:
使用 TCommandLineParser 解析: 帮助信息: 用法: Project1.exe [/u:<用户名>] [/p:<密码>] [/h]
使用 HInstance 和 FindCmdLineSwitch (适用于开关)
如果你的参数只是简单的开关(/silent, /verbose),而不需要附带值,FindCmdLineSwitch 是一个非常轻量且方便的选择。
FindCmdLineSwitch(const Switch: string; IgnoreCase: Boolean = True): Boolean:- 在命令行中查找是否存在指定的开关。
- 它会处理开关的不同形式,如
/switch,-switch,--switch。 - 返回
True找到,False未找到。
示例代码
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Clear;
if FindCmdLineSwitch('silent') then
Memo1.Lines.Add('程序将以静默模式运行。')
else
Memo1.Lines.Add('程序将以正常模式运行。');
if FindCmdLineSwitch('verbose', True) then // True 表示忽略大小写
Memo1.Lines.Add('已启用详细输出模式。');
// 检查大小写敏感的开关
if FindCmdLineSwitch('DEBUG', False) then
Memo1.Lines.Add('已启用调试模式 (大小写敏感)。');
end;
如何测试:
- 编译程序。
- 执行
C:\Project1.exe /silent /verbose,输出:程序将以静默模式运行。 已启用详细输出模式。 - 执行
C:\Project1.exe /DEBUG,输出:程序将以正常模式运行。 已启用调试模式 (大小写敏感)。
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
ParamStr/ParamCount |
简单的参数列表,需要逐个处理。 | 简单直接,无需额外单元,适用于所有程序。 | 需要手动解析,处理带空格的参数或复杂格式时容易出错。 |
TCommandLineParser |
复杂的命令行参数,包含开关、命名参数、值、帮助信息等。 | 功能强大,定义清晰,自动处理格式,提供错误提示,代码可读性高。 | 需要引入 System.CmdLine 单元,对于极简单的场景略显“重”。 |
FindCmdLineSwitch |
只需要检查是否存在某个开关,不需要获取其值。 | 非常轻量,代码简洁,专为开关设计。 | 功能单一,无法处理带值的参数。 |
推荐流程:
- 首先使用
FindCmdLineSwitch来检查一些全局性的、简单的开关(如/help,/silent),这是最快的方式。 - 如果参数逻辑复杂(需要处理
/key:value这样的格式,或者有位置参数),强烈推荐使用TCommandLineParser,它能让你的代码更健壮、更易于维护。 ParamStr/ParamCount是基础,你应该了解它,但在实际项目中,除非需求非常简单,否则优先考虑TCommandLineParser。
对于大多数现代 Delphi 应用程序,TCommandLineParser 是处理命令行参数的最佳实践。
