2013-05-01 13 views
1

當從不同的目錄調用時,此批處理腳本返回不正確的值。我希望有人能幫助我解決這個問題,以便它始終確定正確的APP_HOME目錄。當從不同的目錄調用時,此批處理腳本返回不正確的值

的腳本位於象的位置:

C:\Temp\MyApplication\bin\runner.bat 

而且,我想從執行它:

C:\Temp\OutsideDir\runApp.bat 

當我嘗試,我得到「OutsideDir」,但我想它得到 '本':

C:\Temp\OutsideDir>C:\Temp\MyApplication\bin\runner.bat 
Current directory is: C:\Temp\MyApplication\bin 
This folder name: OutsideDir 
Function arg must match actual folder name. 
This script may not be running from the expected folder. 
There was an error. 

這裏是腳本:

@ECHO off 
SETLOCAL ENABLEDELAYEDEXPANSION 

TITLE Script %~n0%~x0 running from %~dp0 

CALL :getparentfolder bin 

ECHO My app home is: %APP_HOME% 

GOTO :END 

:: function to get parent folder name or APP_HOME of scripts currrent folder 
:: function requires current folders name as an arg or it will fail to run 
:getparentfolder dirName 
SET "BIN_HOME=%~dp0" 
IF "%BIN_HOME:~-1%"=="\" SET "BIN_HOME=%BIN_HOME:~0,-1%" 
ECHO Current directory is: %BIN_HOME% 
FOR /F "tokens=1,* delims=^\" %%I IN ("%BIN_HOME%") DO (
    SET THISFOLDER=%%~nxI 
) 
ECHO This folder name: %THISFOLDER% 
IF "%~1"=="%THISFOLDER%" (
    SET APP_HOME=!BIN_HOME:\%THISFOLDER%=! 
    ECHO APP_HOME: %APP_HOME% 
) ELSE (
    ECHO Function arg must match actual expected folder name. 
    ECHO This script may not be running from the expected folder. 
    GOTO :ERROR 
) 
EXIT /B 0 

:ERROR 
ECHO There was an error. 
PING.exe -n 10 -w 1 127.0.0.1>nul 
:END 
PING.exe -n 10 -w 1 127.0.0.1>nul 
ECHO The script %~n0%~x0 is finished. 
+0

做你試過'CD C:\ TEMP \ OutsideDir \'在跑你的蝙蝠之前? – 2013-05-01 16:48:54

+0

我希望腳本僅返回關於ITSELF的信息,而不是關於腳本位置的信息。這是因爲我想從其他腳本調用此腳本。這很難解釋,但我希望這已經足夠。無論調用它的腳本如何,該腳本都必須能夠確定其自己的家。 – djangofan 2013-05-01 16:53:40

回答

1

試試這個:

@echo off&setlocal 
SET "BIN_HOME=%~dp0" 
IF "%BIN_HOME:~-1%"=="\" SET "BIN_HOME=%BIN_HOME:~0,-1%" 
ECHO Current directory is: %BIN_HOME% 
FOR %%I IN ("%BIN_HOME%") DO (
    SET THISFOLDER=%%~nxI 
) 
ECHO This folder name: %THISFOLDER% 

輸出是:不要求

C:\TEMP\OutsideDir>C:\Temp\MyApplication\bin\runner.bat 
Current directory is: C:\TEMP\MyApplication\bin 
This folder name: bin 
+0

是的,你釘了它。非常感謝! – djangofan 2013-05-01 17:32:50

1

腳本自己的主目錄是%〜dp0。

您的代碼正在獲取當前工作目錄的名稱,因此它失敗了,因爲它與您提供的參數(bin)不匹配。

SET 「BIN_HOME =%〜DP0」

集BIN_HOME到包含腳本的目錄的路徑(在你的情況下,C:\ TEMP \ MyApplication的\ BIN)

FOR /F "tokens=1,* delims=^\" %%I IN ("%BIN_HOME%") DO (
    SET THISFOLDER=%%~nxI 
) 

使用\作爲分隔符從BIN_HOME變量中提取令牌。你已經指定了你最多需要兩個標記(tokens = 1,*),所以這些將被分配給變量%% I和%% J,如下所示(假設%BIN_HOME%是c:\ temp \ myapplication \ bin:

%%I = C: (everything up to the first backslash) 
%%J = temp\myapplication\bin (the remainder of the string 

然後試圖得到個值的文件名部分%% I(%%〜NXI)它獲得當前工作目錄的名稱(路徑「C:」是指當前工作目錄。)

我不知道你想實現什麼,你爲什麼不能簡單地做一些事情,如:

SET APP_HOME=%~dp0 

UPDATE

我不能這樣做,因爲%〜DP0是指當前目錄,而不是當前目錄的父

如果你想腳本的目錄的父目錄,你可以喜歡的東西做到這一點:

SET MYDIR=%~dp0 
echo My directory is %MYDIR% 

CALL :GETPARENT PARENT "%MYDIR:~0,-1" 

echo Parent is %PARENT% 

GOTO :EOF 

:GETPARENT 
SET %1=%~dp2 
GOTO :EOF 
+0

我不能這樣做,因爲%〜dp0引用當前目錄,而不是當前目錄的父目錄。我真正想要獲取的是runner.bat當前目錄的祖父目錄,而不是runApp.bat祖父目錄。 – djangofan 2013-05-01 17:29:20

+0

@djangofan,我不是很清楚你想要什麼。你說你想要「祖父母」目錄,但你接受的答案不會這樣做。 – Joe 2013-05-01 18:23:57

+0

感謝您的幫助。它確實如此。我在博客上發佈了答案:http://thegreenoak.blogspot.com/2013/05/an-improved-testrunnerbat-for-soapui-on.html – djangofan 2013-05-02 01:29:56

0
FOR /F "tokens=1,* delims=\" %%I IN ("%BIN_HOME%") DO (
    SET THISFOLDER=%%~nxJ 
) 
SET thisfolder 

FOR /F "delims=" %%I IN ("%BIN_HOME%") DO (
    IF /i "%%~nxI"=="%~1" (SET APP_HOME=%%~dpI) ELSE (SET APP_HOME=) 
) 
IF NOT DEFINED app_home GOTO error 
SET app_home=%app_home:~0,-1% 
SET app 

插入符號。注意%%〜NX J

就個人而言,我會使用第二替代方法...

和設置您的標題更容易Script %~nx0 ...

相關問題