/ / Scripting in Windows Batch - Windows, Batch-Datei

Skripterstellung in Windows Batch - Windows, Batch-Datei

Ich habe eine ziemlich einfache Batch-DateiÜberprüfen Sie im Grunde genommen, ob eine Umgebungsvariable festgelegt ist, und versuchen Sie dann, sie festzulegen. Die Variable wird nicht richtig eingestellt, und ich bin ziemlich neu in Batch-Dateien im Allgemeinen, daher hatte ich einige allgemeine Fragen zu dem Skript, das ich schreibe. Jeder Einblick wäre dankbar. Hier sind die Fragen, die ich habe.

  1. Was passiert in Zeile 15, wenn ich den vollständigen Namen des Verzeichnisses nicht kenne? d.h. was wäre, wenn ich nur wüsste, dass "pfeifen" ein Teil davon ist und überprüfen wollte, ob es == für DIR ist?
  2. In den Zeilen 16 und 19 versuche ich zu sagen, ob ich dabei bin"whistle-1.0.0", ich weiß, dass die Variable BELFRAMEWORK_HOME auf 1 Verzeichnis darüber gesetzt werden sollte. Ich versuche dies mit "% DIR% .." zu tun, aber dies scheint keine Wirkung zu haben. Wie kann ich BELFRAMEWORK_HOME auf 1 Verzeichnis über "whistle-1.0.0" setzen?
  3. In den Zeilen 17 und 20 das BELFRAMEWORK_HOMEVariable wird nicht gedruckt. Ich verstehe nicht warum, weil es die gleiche Form wie die Zeilen 10 und 12 hat, die die Variable wie erwartet wiedergeben. Warum wird BELFRAMEWORK_HOME nicht wiedergegeben?
  4. Gibt es gute Online-Ressourcen, um mehr über diese Art von Skripten zu erfahren?

Vielen Dank!

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 %*

Antworten:

2 für die Antwort № 1

Oooh, 4 Fragen zum Preis von einer :-)

1) Ich glaube, du willst etwas wie C:folderxxxxWHISTLExxxx zu passen, aber nicht so etwas C:xxxxWHISTLExxxxfolder. Wenn dies der Fall ist, sollten Sie FINDSTR mit einem regulären Ausdruck verwenden, um sicherzustellen, dass das letzte Verzeichnis mit WHISTLE übereinstimmt. Bei der Suche muss die Groß- und Kleinschreibung nicht berücksichtigt werden.

Sie möchten die FINDSTR-Ausgabe nicht. Sie möchten nur wissen, ob die Zeichenfolge gefunden wurde. Sie gibt 1 zurück, wenn sie nicht gefunden wurde (Fehler) und 0, wenn sie gefunden wurde (Erfolg).

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

2) Wenn Sie den abschließenden Backslash möchten, können Sie verwenden

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

Wenn Sie den nachfolgenden Backslash nicht möchten, verwenden Sie

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

3) Sie erleben einen klassischen Stolpersteinfür neue Batch-Benutzer. % BELFRAMEWORK_HOME% wird erweitert, wenn die Zeile analysiert wird, und die gesamte IF-Anweisung, einschließlich der in Klammern gesetzten Codeblöcke, wird als eine Anweisung analysiert. Der erweiterte Wert ist also der Wert, der vor der Ausführung der IF-Anweisung vorhanden war.

Sie können das Problem durch verzögerte Erweiterung lösen.

@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%

Das Ergebnis des oben genannten ist

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

4) Hier sind meine bevorzugten Batch-Scripting-Websites