2015-11-12 70 views
0

我正在自己編寫一個GUI實用程序,用於在CMD窗口中在文件夾之間導航,而不是DOS舊版Norton Change Directory實用程序的樣式。在CMD窗口中使用編寫Delphi GUI實用程序

運行時,應用程序彈出一個文件夾樹,以允許用戶選擇一個文件夾, 導航到該文件夾​​,然後關閉並返回到CMD提示符。目前, 的工作方式是它作爲「主」批處理文件中的第一個命令運行。它在AppData下我的應用程序文件夾中寫入第二批 文件,其中包含將驅動器和 目錄更改爲用戶所選文件夾的命令,然後主批處理文件使用CALL調用此第二批處理文件 。

它工作正常,但實際上改變的是CMD窗口的當前目錄 這種方式給我的印象不雅無論從需要從一個批處理文件 運行的點(使用戶的選擇可以被作用在我的應用程序關閉後)以及 需要輔助批處理文件來執行實際導航。

所以,我的問題是,我的應用程序如何將指令發送到CMD 的實例,該實例擁有運行應用程序的窗口到用戶選擇的文件夾?我試着做的ShellExecute的 「CMD/K ......」但儘管這確實導航到 選擇的文件夾,它在一個新的CMD窗口這樣做,不是一個我的應用程序在運行。該 概念差距我是如何得到目前的CMD到我的應用程序已終止後,我的應用程序的說明 行事。

Fwiw,我想將用戶的文件夾選擇寫入CMD窗口環境中的CMD處理器的環境變量中,以便從那裏開始執行 ,但這似乎要求通過「Run作爲管理員「,我絕對不想要。因爲他們是獨立的過程

+0

我不明白你的意思是「在我的應用程序終止後,如何讓當前的CMD在我的應用程序的指示**上執行。它應該如何行動? – fantaghirocco

+0

當你的應用程序關閉時,爲什麼不直接輸出到cmd'WriteLn(Format('cd'%s'',[the_selected_directory]))'? ' – fantaghirocco

+0

好吧,如果我嘗試在我的應用程序中更改當前目錄,則在我的應用程序終止後,它似乎對CMD窗口的當前目錄沒有任何影響 - 就好像CMD窗口中的「當前目錄」恢復到我的應用運行之前的狀態。所以在我看來,我需要獲得CMD實例,它是「託管」窗口,以改變目錄 – MartynA

回答

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程序一樣。

+0

謝謝,我會給它一個旋轉。我必須承認,我從來沒有機會使用「for/f令牌......」,除了可能與Neil Rubenking的奇妙「DOS批處理文件實驗筆記」書中的例子混淆。 – MartynA

相關問題