编写 Delphi GUI 实用程序以在 CMD window 中使用

Coding a Delphi GUI utility for use in a CMD window

我正在为自己编写一个 GUI 实用程序,用于在 CMD window 中在文件夹之间导航, 而是采用适用于 DOS 的旧 Norton Change Directory 实用程序的风格。

当运行时,应用程序会弹出一个文件夹树,让用户select一个文件夹 导航然后关闭并 returns 到 CMD 提示符。目前,它的方式 有效的是它是 运行 作为 "main" 批处理文件中的第一个命令。它写了一个次要批次 文件,在 AppData 下我的应用程序文件夹中,包含更改驱动器和 目录到用户 selected 的文件夹,然后主批处理文件调用它 使用 CALL.

的第二个批处理文件

它工作正常,但这种方式实际上改变了 CMD window 的当前目录 从需要从批处理文件中 运行 的角度来看,我觉得很不优雅 (以便用户的 selection 可以在我的应用程序关闭后采取行动)和 需要辅助批处理文件来进行实际导航。

所以,我的问题是,我的应用程序如何将指令发送到 CMD 实例 拥有 window 其中的应用是 运行 用户 select 编辑的文件夹?我试过做一个 ShellExecute 的 "CMD /K ..." 但尽管确实导航到 selected 文件夹,它在新的 CMD window 中执行此操作,而不是我的应用程序在 运行 中的那个。 我的概念差距是如何让当前的 CMD 执行我的应用程序的指令 之后我的应用终止了。

Fwiw,我想尝试将用户文件夹 selection 写入 CMD window 环境中的环境变量,以便 CMD 处理器执行 从那里开始行动,但这似乎需要通过 "Run as Administrator" 打开 CMD window,我绝对不希望这样。

您的程序不能影响命令解释器的环境变量,因为它们是独立的进程。您的程序也不能直接更改命令解释器的目录,因为它们是单独的进程。

您需要使用批处理文件,因为命令解释器在内部执行批处理文件。由于都是同一个过程,批处理文件有权更改当前目录,并且要使更改在批处理文件完成后仍然有效 运行.

因此,您的交互式程序需要某种方式将目录选择传回批处理文件,以便它可以对其进行操作。

您可以将结果写入标准输出,而不是将指令写入另一个批处理文件。拥有批处理文件 capture that output into a variable,然后对该变量执行 cd。批处理代码看起来像这样:

for /f "tokens=*" %%a in ('[select_dir.exe]') do (
  set DIRSELECTION=%%a
)
cd /d %DIRSELECTION%

您的 Delphi 代码如下所示:

writeln(selected_dir);

要使该命令起作用,您需要确保您的程序被标记为控制台程序,与 {$APPTYPE CONSOLE} 一样。如果不是,则批处理文件将不会收到任何输出,甚至可能不会等待您的程序完成 运行 才继续。控制台程序可以显示一个 TForm,就像 GUI 程序一样。