Написание простого файла bat? - PullRequest
2 голосов
/ 11 марта 2010

Я пишу простой командный файл и получаю сообщение об ошибке «Синтаксис команды неверен» для оператора if. Пакетный файл выглядит следующим образом:

@echo off

set ARCH=%PROCESSOR_ARCHITECTURE%

if %ARCH% == 'x86'
(
)

я тоже пробовал

if %ARCH% EQU 'x86'

Что не так с оператором if?

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

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

@echo off
set ARCH=%PROCESSOR_ARCHITECTURE%
if %ARCH% == x86 ( echo ok )
rem or %ARCH% EQU x86

и пока вы занимаетесь этим, почему бы не выучить vbscript , вот эквивалент

Set WshShell = WScript.CreateObject("WScript.Shell")
Set Wsharch = WshShell.Environment("SYSTEM")
arch=Wsharch.Item("PROCESSOR_ARCHITECTURE")
If arch = "x86" Then
    WScript.Echo "PROCESSOR_ARCHITECTURE is x86"
End If
' if Instr(arch,"86") > 0 then
4 голосов
/ 11 марта 2010

ETA:

На самом деле я хочу проверить, содержит ли архитектура строку 64. Что-то вроде:

if %ARCH% == '*64*' ( echo ok )

Как я могу это сделать?

Для этого вы можете воспользоваться помощью небольшого инструмента под названием findstr, который выполняет поиск шаблонов в файлах или вывод команды. Просто передайте значение переменной в findstr:

echo %ARCH% | findstr 64

, которая найдет любую строку в выводе, содержащую 64 где-нибудь. В этом случае есть только одна строка, но это нормально.

Однако это также приводит к выводу строки на экран, поэтому измените ее на следующее:

echo %ARCH% | findstr 64 > nul 2>&1

, который перенаправит любой вывод (включая сообщения об ошибках) в ничто.

Теперь findstr устанавливает специальное значение (код выхода или уровень ошибки) в зависимости от того, была найдена строка или нет. Вы можете использовать это, чтобы проверить, действительно ли 64 появилось в выводе:

echo %ARCH% | findstr 64 > nul 2>&1
if errorlevel 1 (
    echo 64 did NOT appear (error level greater 0 usually means failure)
) else (
    echo 64 DID appear
)

На ваш оригинальный вопрос:

Открывающая скобка должна встречаться в той же строке, что и сам оператор if:

@echo off 

set ARCH=%PROCESSOR_ARCHITECTURE% 

if %ARCH% == x86 ( 
    rem ...
) 

работает.

Помните, что парсер cmd основан на строках; поэтому рекомендуется соблюдать осторожность со всем, что должно занимать несколько строк. Другой вариант - избежать разрыва строки:

@echo off 

set ARCH=%PROCESSOR_ARCHITECTURE% 

if %ARCH% == x86 ^
( 
    rem ...
)

^ является escape-символом в cmd, и в этом случае он фактически является оператором продолжения строки, поэтому синтаксический анализатор принимает открывающую скобку на следующей строке как часть текущего оператора (который обычно завершается разрыв строки).

И да, использование одинарных кавычек для литерального строкового значения в сравнении приведет вас к другим проблемам, как заметил Карлос Гутьеррес , поскольку по сути все в cmd - строковый литерал. Таким образом, вы будете сравнивать с литеральной строкой

'x86'

вместо

x86

что на самом деле содержится в переменной окружения.

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