编写用于CMD窗口的Delphi GUI实用程序

时间:2015-11-12 15:32:43

标签: windows delphi cmd delphi-7

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

运行时,应用会弹出一个文件夹树,允许用户选择要的文件夹 导航然后关闭并返回CMD提示。此刻,它的方式 的工作原理是它作为“主”批处理文件中的第一个命令运行。它写了一个二级批处理 文件,在AppData下的应用程序文件夹中,包含更改驱动器和的命令 目录到用户选择的文件夹,然后主批处理文件调用它 使用CALL的第二个批处理文件。

它工作正常,但这种方式实际上改变了CMD窗口的当前目录 从需要从批处理文件运行的角度来看,这对我来说都是不优雅的 (以便在我的应用程序关闭后可以对用户的选择进行操作)和 需要辅助批处理文件来进行实际导航。

所以,我的问题是,我的应用程序如何将指令发送到CMD实例 拥有应用程序运行到用户所选文件夹的窗口?我试过做一个ShellExecute “CMD / K ......”虽然确实可以导航到 选择的文件夹,它在新的CMD窗口中执行,而不是我的应用程序运行的那个 概念上的差距我是如何让当前的CMD按照我的应用程序的指示行事 我的应用程序终止后。

Fwiw,我想过尝试将用户的文件夹选择写入CMD窗口环境中的环境变量,以供CMD处理器使用 从那里开始行动,但这似乎要求通过“以管理员身份运行”打开CMD窗口,这绝对不是我想要的。

1 个答案:

答案 0 :(得分:2)

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

您需要使用批处理文件,因为命令解释程序在内部执行批处理文件。由于它具有相同的过程,因此批处理文件可以更改当前目录,并且在批处理文件完成运行后该更改仍然有效。

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

您可以将结果写入标准输出,而不是将指令写入另一个批处理文件。拥有批处理文件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程序一样。