2014-01-20 138 views
0

我正在運行Windows 7x64和Excel 2010x32。我使用ExecCmd(一個等待命令提示進程完成的Microsoft函數)通過​​vba調用32位dos程序(用Fortran編寫)。我向這個函數發送一個命令行,它明確包含程序路徑和輸入文件和輸出文件的路徑。通過shell運行程序

這在我的PC上以及在運行相同軟件(OS和Office)的公司PC上運行良好,並且我可以一般訪問C:驅動器。

在其他公司PC上,如果沒有對C:驅動器的一般訪問權限,則這不起作用 - 即dos程序不生成輸出文件。在這些PC上,我仍然可以手動在命令提示符下運行程序。只是調用此命令提示符不能通過Excel VBA工作。

現在奇怪的是,我可以通過在命令行開始處添加「cmd.exe/c」成功運行這些程序之一。這似乎是在命令提示符(!)內運行命令提示符。另一個程序(順便說一下,它比較大)在這些PC上通過vba完全不起作用。我需要能夠爲其他員工提供有用的東西。

任何人都可以點亮這裏發生的事情,並建議解決?我可以通過一些代碼,但我認爲上面應該是自我解釋。

+0

我認爲是的,你應該編輯你的問題,並粘貼你有幾個關鍵代碼行試過。 –

+0

您運行的命令提示符可能具有管理權限,可能是您從Excel運行時缺少的。它可能與錯誤的工作目錄有關。有點太難以猜測正確。 –

+0

「32位DOS程序」在條款上並不矛盾,但我不認爲這是你的意思;一方面,DOS程序不能在64位版本的Windows上運行。你的意思是一個32位的命令行程序嗎? –

回答

4

您將命令外殼與控制檯窗口混淆。在這種情況下,區分至關重要。

控制檯模式程序(又名「命令行程序」)需要一個控制檯窗口來提供輸入和輸出。當從GUI程序啓動控制檯模式程序時,Windows會自動爲其創建控制檯窗口(除非另有說明)。

命令外殼(又名「命令提示符」)是一個控制檯模式程序cmd.exe

這裏重要的一點是,並非每個控制檯窗口都有一個運行在其中的實例cmd.exe。當從GUI程序啓動控制檯模式程序時,Windows會自動創建控制檯窗口,但而不是會自動創建cmd.exe的實例。如果你想傳遞一個命令到cmd.exe你必須自己做,或者使用運行時庫例程來爲你做。

ExecCmd不這樣做;它直接運行程序。因此將cmd /c <command>傳遞給ExecCmd並不是「在命令提示符下運行命令提示符」。如果沒有cmd /c,您沒有運行命令shell命令,則只是啓動可執行文件。

有多種原因讓您傳遞的命令可能需要傳遞給命令shell。例如:

  • 它可能是一個內置的像dirtype僅命令外殼內是否存在命令;

  • 它可能包括重定向或流水線操作符或環境變量替換;

  • 它可能是一個腳本而不是可執行文件。

還有其他情況。如果您向我們展示命令行被傳遞給ExecCmd,我們可能會提供更具體的建議。 (事實上​​,相同的命令行顯然在某些機器上工作是令人困惑的,但不能沒有更多的信息解決。)

+0

感謝Harry。我需要知道這一點,對我來說重要的是,調用cmd.exe和不調用它的區別在於傳遞給我的程序的命令行長度有所不同,我無法分析輸出如果它超過一定的長度,則從它的文件名。 –