Какой синтаксис для .bat? - PullRequest
       9

Какой синтаксис для .bat?

3 голосов
/ 24 февраля 2010
if "%OS%"=="Windows_NT" @setlocal
...
if "%OS%"=="Windows_NT" @endlocal

Означает ли вышесказанное в основном это:

if(OS == 'Windows_NT'):
...
endif

Для чего setlocal? 1008 *

Как летучая мышь идентифицирует endif?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2010

1001 * попробовать *

setlocal /? 

в командной строке

Что касается if утверждений: help if должно показать вам все, что вам нужно знать. Пакетные файлы имеют только одну строку if операторов форм

if [ состояние ] [ оператор ]
if [ состояние ] [ Заявление ] else [ Заявление ]

Однако [ оператор ] может быть блоком, разделенным скобками:

if [ состояние ] (
[ утверждение ]
[ Заявление ]
...
)

if [ состояние ] (
[ утверждение ]
...
) else (
[ Заявление ]
...
)

Нет явного ключевого слова end if. Конец оператора if отмечен концом строки или концом блока в скобках.

Также имейте в виду, что вы должны быть осторожны с настройкой и последующим использованием переменных среды в одном блоке. Читайте в help set о отложенном расширении для ловушек там.

2 голосов
/ 24 февраля 2010
0 голосов
/ 14 января 2016

Объяснение на основе практического примера: Apache Tomcat

Я выбрал этот пример, потому что в нем есть все, что вы хотите знать. Я также добавил несколько простых примеров.

  1. "%OS%" == "Windows_NT"

    Он использовался в старых версиях Tomcat (catalina.bat) как:

    if "%OS%" == "Windows_NT" setlocal
    

    но начиная с Tomcat 8 (на данный момент доступны только Tomcat 8 и Tomcat 9 - версия этапа), его заменили на:

    setlocal
    

    потому что %OS% всегда означает Windows_NT в новой операционной системе Windows. Итак, в современных версиях Microsoft Windows этот if бесполезен. Просто используйте setlocal.

    Ссылки

    • https://en.wikipedia.org/wiki/Environment_variable#OS (Windows):

      Переменная % OS% содержит символическое имя семейства операционной системы , чтобы различать различные наборы функций в пакетных заданиях. В Windows NT , Windows 2000 , Windows XP и Windows 7 , всегда содержит строку "Windows_NT" . Она напоминает переменную среды с идентичным названием% OS%, обнаруженную во всех связанных с DOS операционных системах Digital Research, таких как Concurrent DOS, Multiuser DOS, REAL / 32, DOS Plus, DR DOS, Novell DOS и OpenDOS.

    • Я не нашел никаких ссылок для Windows 8 и Windows 10 , но я протестировал его на обоих из них, и он ведет себя одинаково (он содержит " Windows_NT ").

    • https://en.wikipedia.org/wiki/Environment_variable#.25OS.25 (DOS):

      Эта переменная содержит имя операционной системы для того, чтобы различать различные связанные с DOS операционные системы Digital Research-origin в пакетных заданиях и приложениях. [5] Известные значения включают «DOSPLUS» (DOS Plus 1.2 в эмуляции DOS), «CPCDOS 4.1» (DOS Plus 1.2 в эмуляции CP / M), «DRDOS» (DR DOS 3.31-6.0, DR DOS Panther, DR DOS StarTrek, DR- DOS 7.02 [5] -7.05), «EZDOS» (EZ-DOS 3.41), «PALMDOS» и «NetWare PalmDOS» (PalmDOS 1.0), «NWDOS» (Novell DOS 7), «NWDOS7» (Novell DOS 7 Beta) , "OPENDOS" (Caldera OpenDOS 7.01, Caldera DR-OpenDOS 7.02), "CDOS" (Concurrent DOS), "CPCDOS" (Concurrent PC DOS), "CDOS386" (Concurrent DOS 386), "DRMDOS" (DR Multiuser DOS) , «MDOS» (CCI Multiuser DOS), «REAL32» (REAL / 32). [2] [6] MS-DOS INTERSVR также ищет значение «DRDOS». [6] См. Также переменную среды с таким же именем% OS%, которая была позже представлена ​​в семействе Microsoft Windows NT.

  2. if

    В старых Tomcat версиях (до 8), если условие "%OS%" == "Windows_NT" в if "%OS%" == "Windows_NT" setlocal было ложным, только setlocal было бы пропущено. Другие команды выполнялись бы нормально.

    В вашем случае , если условие истинно (и, вероятно, так оно и есть - см. Объяснение выше), тогда будет выполняться только одна команда (эта виртуальная endif приходит точно в конце строки - сразу после @setlocal).

    Следующий простой пример должен быть понятен:

    @echo off
    rem testif.bat
    if "1" == "2" echo a
    echo b
    
    if "1" == "1" echo c
    echo d
    

    Запуск testif.bat из консоли выводит:

    b
    c
    d
    

    Даже если первое условие было ложным, это значение влияло только на echo a, поскольку оно было пропущено. Итак, виртуальный endif идет после echo a (до echo b).

  3. setlocal

    В Tomcat (\ bin \ startup.bat) вы можете установить переменные CATALINA_HOME и CATALINA_BASE следующим образом:

    set CATALINA_HOME=%~dp0
    set CATALINA_BASE=%CATALINA_HOME%
    

    после строки setlocal. Если вы добавите эти строки до setlocal, эти две переменные будут доступны после окончания пакетного сценария. Они не имеют «побочных эффектов», если вы запускаете скрипт с помощью двойного щелчка (обычный способ), но имеет значение, хотите ли вы запустить его из командной строки.

    Упрощенная версия:

    @echo off
    rem 1.bat
    set A=1
    setlocal
    set B=2
    endlocal
    set C=3
    

    Запустите указанный выше сценарий (1.bat) из командной строки и после этого выполните следующие команды:

    rem - prints 1
    echo %A%
    rem - prints %B%
    echo %B%
    rem - prints 3
    echo %C%
    

    Итак, поскольку вы не хотите иметь значения для A и C, вы должны установить переменную окружения между setlocal и endlocal. Конечно, если вы запускаете те же самые команды echo из нового приглашения, ни одна из них не будет установлена ​​(вывод будет %A%, %B%, %C%).

    Если явного endlocal нет, представьте, что оно находится в конце пакетного файла:

    Ссылка:

    • https://technet.microsoft.com/en-us/library/bb491001.aspx

      Используйте setlocal для изменения переменных среды при запуске командного файла. Изменения среды, сделанные после запуска setlocal, являются локальными для командного файла. Cmd.exe восстанавливает предыдущие настройки, когда встречает команду endlocal или достигает конца пакетного файла .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...