在Windows批处理脚本

问题描述:

我有一个非常简单的批处理文件,基本上检查是否设置了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 %* 

哦,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