2015-02-06 109 views
0

我有一個批處理腳本,我從一個文件夾中運行,即在另一個文件夾中調用.NET可執行文件,然後將文件夾參數傳遞給另一個文件夾中存在的文件。它看起來像這樣:windows批處理腳本指向正確的路徑

SET start_dir=%cd% 
cd.. 
cd apps 
SET apps_dir=%cd% 
SET my_dir=%apps_dir%\MY_DIR 

cd C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug 

ConsoleApplication1.exe -i -f %my_dir% 

cd %start_dir% 

這是將目錄傳遞到批處理腳本中的應用程序的正確方法?我的應用程序似乎無法找到目錄,但我不知道是否有方法在腳本中解決這些問題,或者如果這是正確的方式或不是,因爲這是我第一次完成Windows批處理腳本。謝謝!

回答

0

應該是,但批處理對SET語句中的空格敏感。 SET FLAG = N設置一個名爲「FLAG 空間」變量的「空間 N」

語法SET "var=value"(其中值可以是空的)用於確保任何雜散尾部空格不包括在所述值的值分配。 set /a可以安全地使用「無引號」。

當文件或目錄名稱中有空格時,這很重要。

我建議一些細微的變化:

@echo off 
setlocal 
SET "start_dir=%cd%" 
cd .. 
cd apps 
SET "apps_dir=%cd%" 
SET "my_dir=%apps_dir%\MY_DIR" 

cd "C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug" 

ConsoleApplication1.exe -i -f "%my_dir%" 

cd "%start_dir%" 

注意到

  • 關閉@echo關閉命令回顯批處理期間

  • SETLOCAL確保任何環境當批次結束時,所做的更改將被撤消,所以您不會遇到之前運行所做更改的陳舊數據問題

  • CD 「destinationdir」 - 引號是通常需要,即使 「在路徑中的空間」,但可能需要爲奇怪的路徑名(如含&那些)

  • 「%MY_DIR%」作爲參數爲consoleapplication1,以確保它視爲一個單一的令牌

  • 如果consoleapplication1.exe是在路徑上的目錄,那麼就沒有必要cd到該目錄;命令consoleapplication1 ....將訪問它。當然,如果應用程序提供了一個不合格的文件名,然後它會假設該文件是在current目錄,而不是executable的目錄,所以有可能需要切換目錄...

  • 如果consoleapplication1.exe位於不在路徑上的目錄中,則"C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug\consoleapplication1" ....將訪問它。如果包含引號,則引號是無害的,但對於完整可執行文件名稱中的空格而言是必需的。

  • path從提示符中將顯示執行路徑;每個目錄用分號分隔。

  • 有可能使用

@echo off 
setlocal 
SET "start_dir=%cd%" 
pushd ..\apps 
SET "apps_dir=%cd%" 
SET "my_dir=%apps_dir%\MY_DIR" 
pushd "C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug" 

ConsoleApplication1.exe -i -f "%my_dir%" 
popd 
popd 

其中pushd切換到指定的目標目錄當前保存在一個簡單的堆棧。 popd從堆棧中彈出目錄。