/ / Scripting no Windows Batch - windows, batch-file

Script no Windows Batch - Windows, arquivo em lote

Eu tenho um arquivo em lote muito simples que ébasicamente verificando se uma variável de ambiente está definida e, em seguida, tentando defini-la. Não está configurando a variável corretamente, e sou muito novo em arquivos em lote em geral, então tive algumas perguntas gerais sobre o script que estou escrevendo. Qualquer ideia seria apreciada. Aqui estão as perguntas que tenho.

  1. Na linha 15, e se eu não souber o nome completo do diretório? ou seja, e se eu soubesse que "apito" fazia parte dele e quisesse verificar se era == para DIR?
  2. Nas linhas 16 e 19, estou tentando dizer se estou em"whistle-1.0.0", eu sei que a variável BELFRAMEWORK_HOME deve ser definida para 1 diretório acima dela. Tento fazer isso com "% DIR% ..", mas parece não ter efeito. Como posso definir BELFRAMEWORK_HOME para 1 diretório acima de "whistle-1.0.0"?
  3. Nas linhas 17 e 20, o BELFRAMEWORK_HOMEvariável não é impressa. Não entendo o porquê, porque é da mesma forma que as linhas 10 e 12, que ecoam a variável conforme o esperado. Por que BELFRAMEWORK_HOME não ecoa?
  4. Por último, existem bons recursos online para aprender mais sobre este tipo de script?

Obrigado!

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

Respostas:

2 para resposta № 1

Oooh, 4 perguntas pelo preço de uma :-)

1) Eu acredito que você quer algo como C:folderxxxxWHISTLExxxx combinar, mas não algo como C:xxxxWHISTLExxxxfolder. Se for esse o caso, você desejará usar FINDSTR com uma expressão regular para ter certeza de que o último diretório é o que corresponde a WHISTLE. A pesquisa deve ser insensível a maiúsculas e minúsculas.

Você não quer a saída FINDSTR. Você só quer saber se a string foi encontrada. Ela retorna 1 se não for encontrada (erro) e 0 se for encontrada (sucesso).

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

2) Se você quiser a barra invertida final, você pode usar

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

Se você não quiser a barra invertida no final, use

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

3) Você está enfrentando um obstáculo clássicopara novos usuários de lote. O% BELFRAMEWORK_HOME% é expandido quando a linha é analisada e toda a instrução IF, incluindo os blocos de código entre parênteses, é analisada como uma instrução. Portanto, o valor expandido é o valor que existia antes da instrução IF ser executada.

Você pode resolver o problema usando a expansão atrasada.

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

O resultado do acima é

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

4) Aqui estão meus sites de script em lote favoritos