2012-08-15 283 views
0

我有一個非常簡單的批處理文件,基本上檢查是否設置了enviornment變量,然後嘗試設置它。它沒有正確地設置變量,而且我對批處理文件通常很陌生,所以我對我正在編寫的腳本有一些一般性問題。任何洞察力將不勝感激。這是我的問題。在Windows批處理腳本

  1. 在第15行,如果我不知道目錄的全名呢?即如果我剛剛知道'吹口哨'是它的一部分,並且想要檢查它是否爲DIR?
  2. 在第16和19行,我想說如果我在'whistle-1.0.0'中,我知道BELFRAMEWORK_HOME變量應該設置爲1之上的目錄。我嘗試用'%DIR%..'來做到這一點,但這似乎沒有效果。我如何將BELFRAMEWORK_HOME設置爲'whistle-1.0.0'上方的1個目錄?
  3. 在第17和20行中,BELFRAMEWORK_HOME變量未打印。我不明白爲什麼,因爲它與第10行和第12行有相同的形式,如預期的那樣迴應變量。爲什麼BELFRAMEWORK_HOME沒有迴音?
  4. 最後一件事,有沒有什麼好的在線資源可以更多地瞭解這種類型的腳本?

謝謝!

[email protected] off 
2 
3if not defined JAVA_OPTS (
4 set JAVA_OPTS=-Xmx1024m -Dderby.stream.error.field=org.openbel.framework.common.enums.DatabaseType.NULL_OUTPUT_STREAM 
5) else (
6 set JAVA_OPTS=%JAVA_OPTS% -Dderby.stream.error.field=org.openbel.framework.common.enums.DatabaseType.NULL_OUTPUT_STREAM 
7) 
8 
9set DIR=%CD% 
10echo "DIR/CD : %DIR%" 
11set DIR=%~dp0 
12echo "DIR/~dp0 : %DIR%" 
13 
14if not defined BELFRAMEWORK_HOME (
15 if "%DIR%"=="whistle-1.0.0" (
16  set BELFRAMEWORK_HOME=%DIR%\..\ 
17  echo "DIR == whistle, BELFRAMEWORK_HOME is now: %BELFRAMEWORK_HOME%" 
18 ) else (
19  set BELFRAMEWORK_HOME=%DIR%\..\ 
20  echo "DIR != whistle, BELFRAMEWORK_HOME is now: %BELFRAMEWORK_HOME%" 
21 ) 
22) 
23 
24set WHISTLE_HOME=%~dp0 
25java %JAVA_OPTS% -jar %WHISTLE_HOME%\whistle-1.0.0.jar %* 

回答

2

哦,4個問題的一個:-)

1)的價格,我相信你想要的東西,像C:\folder\xxxxWHISTLExxxx\匹配,而不是像C:\xxxxWHISTLExxxx\folder\。如果是這種情況,那麼你會希望使用FINDSTR和正則表達式來確保最後一個目錄與WHISTLE匹配。搜索必須不區分大小寫。

你不想要FINDSTR輸出。你只是想知道是否找到了字符串。如果未找到(錯誤),則返回1,如果找到(成功)則返回0。

echo %DIR% | findstr /irc:"whistle[^\\]*[\\]*$" >nul && (
    rem Code for success (string found) 
) 
    rem Code for failure (string not found) 
) 

2)如果你想尾部的反斜槓,那麼你可以使用

for %%A in ("%DIR%\.") do set "BELFRAMEWORK_HOME=%%~dpA" 

如果你不想尾部的反斜槓,然後用

for %%A in ("%DIR%\..") do set "BELFRAMEWORK_HOME=%%~fA" 

3 )您正遇到新批處理用戶的經典絆腳石。 %BELFRAMEWORK_HOME%在解析該行時展開,並且整個IF語句(包括帶括號的代碼塊)被解析爲一個語句。所以擴展值是在執行IF語句之前存在的值。

您可以使用延遲擴展來解決問題。

@echo off 
setlocal enableDelayedExpansion 
set var=BEFORE 
(
    set var=AFTER 
    echo within block normal expansion = %var% 
    echo within block delayed expansion = !var! 
) 
echo after block normal expansion = %var% 

上述結果是

within block normal expansion = BEFORE 
within block delayed expansion = AFTER 
after block normal expansion = AFTER 

4)這裏是我最喜歡的批處理腳本的網站

+0

非常感謝!我不僅能夠使我的批處理文件正常工作,而且我理所當然地認爲我對這個腳本中發生的事情有了更好的理解。優秀的參考,我期待更深入地閱讀它們。如果我可以給你4個複選標記,我會:) – Houdini 2012-08-15 18:20:38