0

我有一个非常简单的批处理文件,它基本上是检查是否设置了环境变量,然后尝试设置它。它没有正确设置变量,而且我对批处理文件一般都很陌生,所以我对我正在编写的脚本有一些一般性的问题。任何见解将不胜感激。这是我的问题。

  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. 最后一件事,有没有什么好的在线资源来学习更多关于这种类型的脚本?

谢谢!

1@echo 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 回答 1

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)这是我最喜欢的批处理脚本网站

于 2012-08-15T17:28:47.040 回答