【问题标题】:Coding a Delphi GUI utility for use in a CMD window编写用于 CMD 窗口的 Delphi GUI 实用程序
【发布时间】:2015-11-15 03:33:57
【问题描述】:

我正在为自己编写一个 GUI 实用程序,用于在 CMD 窗口中导航文件夹, 而是采用旧的 DOS 诺顿更改目录实用程序的风格。

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

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

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

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

【问题讨论】:

  • 我无法理解您所说的“如何让当前的 CMD 在我的应用程序终止后 执行我的应用程序的指令”。它应该如何行动?
  • 当您的应用关闭时,为什么不简单地输出到 cmd WriteLn(Format('cd "%s"', [the_selected_directory]))? `
  • 好吧,如果我尝试从我的应用程序中更改当前目录,在我的应用程序终止后它似乎对 CMD 窗口的当前目录没有影响 - 就好像“当前目录" 在 CMD 窗口中恢复到我的应用程序运行之前的状态。所以在我看来,我需要获取“托管”窗口以更改目录的 CMD 实例
  • “为什么不简单地输出到 cmd”,因为无论在应用程序运行的 CMD 窗口中还是在其上,这都没有影响。
  • @MartynA 您是打开控制台窗口的程序还是通过特定命令从控制台窗口中启动的?

标签: windows delphi cmd delphi-7


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你,我会试一试。我必须承认,我从来没有机会使用“for /f tokens ...”,除非可能会在 Neil Rubenking 的精彩的“DOS Batch File Lab Notes”一书中弄乱这些例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2011-02-22
相关资源
最近更新 更多