2010-03-11 5 views
2

Я пишу простой пакетный файл, и я получаю это «Синтаксис команды неверен» ошибка для если statement.The пакетного файла, как показано ниже:Написание простого файла bat?

@echo off 

set ARCH=%PROCESSOR_ARCHITECTURE% 

if %ARCH% == 'x86' 
(
) 

Я также попытался

if %ARCH% EQU 'x86' 

Что не так с утверждением if?

ответ

5

попробовать

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

и пока вы на нее, почему бы не learn 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 
+0

Это сработало. Благодарю. На самом деле, я хочу проверить, содержит ли архитектура строку 64. Что-то вроде: if% ARCH% == '* 64 *' (echo ok) Как я могу это сделать? – Sam

+0

Я не эксперт по партии, поэтому я надеюсь, что кто-то может помочь вам в этом. однако, я знаю, что vbscript делает то, что вам нужно более легко, например, поиск строк, регулярных выражений и улучшенных структур данных, таких как массивы, словари и т. д. Поэтому, если вам интересно, научитесь использовать vbscript вместо этого. – ghostdog74

+0

Уже сделано :-). Тем не менее, массивы и словари довольно естественно встречаются в пакетных файлах с переменными окружения. Они все-таки уловки для этих вещей ;-) – Joey

4

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 ... 
) 

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

И да, использование одинарных кавычек для литерального строкового значения в сравнении приведет вас к другим проблемам, так как Carlos Gutiérrez отметил, поскольку по существу все в cmd является строковым литералом. Таким образом, вы будете сравнивать с символьной строки

'x86' 

вместо

x86 

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

Смежные вопросы