/ / Skriptovanie v systéme Windows Batch - Windows, dávkový súbor

Skriptovanie v dávkach systému Windows - Windows, dávkový súbor

Mám celkom jednoduchý dávkový súbor, ktorý jev zásade kontrola, či je nastavená premenná prostredia, a potom pokus o jej nastavenie. Nie je to správne nastavenie premennej a som v dávkových súboroch všeobecne celkom nový, takže som mal nejaké všeobecné otázky týkajúce sa skriptu, ktorý píšem. Ocenili by sme akýkoľvek náhľad. Tu mám otázky.

  1. V riadku 15, čo keď nepoznám celé meno adresára? tj. čo keby som vedel, že „píšťalka“ je jej súčasťou, a chcel by som skontrolovať, či to bolo == podľa DIR?
  2. V riadkoch 16 a 19 sa snažím povedať, či som v"whistle-1.0.0", viem, že premenná BELFRAMEWORK_HOME by mala byť nastavená na 1 adresár nad ňou. Snažím sa to robiť pomocou „% DIR% ..“, ale zdá sa, že to nemá žiadny vplyv. Ako môžem nastaviť BELFRAMEWORK_HOME na 1 adresár nad „whistle-1.0.0“?
  3. Na riadkoch 17 a 20 BELFRAMEWORK_HOMEpremenná sa nevytlačí. Nechápem prečo, pretože má rovnakú formu ako riadky 10 a 12, ktoré odrážajú premennú podľa očakávania. Prečo BELFRAMEWORK_HOME nezaznieva?
  4. Posledná vec, existujú nejaké dobré online zdroje na získanie ďalších informácií o tomto type skriptovania?

Vďaka!

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

odpovede:

2 pre odpoveď č. 1

Óóó, 4 otázky za cenu jednej :-)

1) Verím, že chcete niečo také C:folderxxxxWHISTLExxxx zodpovedať, ale nie niečo ako C:xxxxWHISTLExxxxfolder. Ak je to tak, potom budete chcieť použiť FINDSTR s regulárnym výrazom, aby ste sa uistili, že posledný adresár je v zhode s WHISTLE. Pri hľadaní sa musia rozlišovať malé a veľké písmená.

Nechcete výstup FINDSTR. Chcete len vedieť, či je reťazec nájdený. ​​Vráti 1, ak sa nenájde (chyba) a 0, ak sa nájde (úspech).

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

2) Ak chcete koncovú spätnú lomku, môžete použiť

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

Ak nechcete koncovú lomku, použite

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

3) Zažívate klasický kameň úrazupre nových dávkových používateľov. % BELFRAMEWORK_HOME% sa rozšíri pri analýze riadku a celý príkaz IF, vrátane blokov v zátvorkách, sa analyzuje ako jeden príkaz. Takže rozšírená hodnota je hodnota, ktorá existovala pred vykonaním príkazu IF.

Problém môžete vyriešiť použitím oneskorenej expanzie.

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

Výsledkom vyššie uvedeného je

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

4) Tu sú moje obľúbené dávkové skriptovacie webové stránky