4

Всякий раз, когда я набираю ( то есть открывающая скобка в командной строке, это происходит:

(
More? 

Если я продолжу печатать ( или любой другой символ, мне будет предложено то же сообщение. Это останавливается, если я вхожу ) , т.е. закрывающая скобка , хотя я получаю ошибку, которая говорит:

) was unexpected at this time

Кроме этого, я не мог найти, что делает эта команда. Есть идеи, что он делает?

3 ответа3

6

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

if not exist c:\myfile (
  echo File doesn't exist
) else (
  echo File DOES exists
  del c:\myfile
)

Обратите внимание, что обычно IF ELSE должен находиться в одной строке, и вы можете выполнить только одну команду в THEN и в предложении ELSE.
Использование «()» рассматривает весь блок (xxxxx) как одну команду и даже как если бы оно появилось в одной строке.

3

Здесь уже размещено много полезной информации - например, круглые скобки - это «оператор группировки, который позволяет группировать последовательность команд вместе, чтобы использовать ее там, где оболочка CMD обычно ожидает появления одной команды», которые «похожи начальный блок и конечный блок » - но некоторые простые вещи были упущены из виду:

1. Как не получить ошибку «неожиданно в это время»

Вы можете получить что-то полезное, просто набрав команду (ы) в поле More?  незамедлительный:

C:\> (
More? date /t
More? )
Tue 04/11/2017

C:\> (
More? dir \Windows\win.ini
More? )
 Volume in drive C is OS
 Volume Serial Number is ▒▒▒▒-▒▒▒▒

 Directory of C:\Windows

08/13/2014  12:26 PM               435 win.ini
               1 File(s)            435 bytes
               0 Dir(s)  ▒▒▒,▒▒▒,▒▒▒,▒▒▒ bytes free

C:\>

Вы можете вводить несколько команд в отдельных строках и перемещать ) до конца последней строки:

C:\> (
More? date /t
More? time /t
More? )
Tue 04/11/2017
06:18 PM

C:\> (
More? date /t
More? time /t)
Tue 04/11/2017
06:18 PM

C:\>

2. Как ( и ) влияет на значение команды?

Как уже отмечали другие, есть такие команды, как

C:\> for %f in (\Windows\*.dll) do @echo %f

где () являются частью синтаксиса самой команды (в данном случае FOR).  Если вы удалите скобки, вы получите синтаксическую ошибку.  Я не об этом.

Как заявлено до тошноты, в скобках группируются команды.  Рассмотрим эту командную строку:

echo cat & echo dog | findstr /n a

Это значит

  1. Сделать echo cat , а потом
  2. Do echo dog | findstr /n a
    Поскольку слово «собака» не содержит буквы «а», эта команда не будет выводить.

Соответственно, выход для вышеупомянутого

C:\> echo cat & echo dog | findstr /n a
cat

Так же,

C:\> echo cat & echo dog | findstr /n o
cat
1:dog

в которой мы получаем дополнительный 1:dog выход собаки, потому что «собака» действительно содержит «о» и «собака» является первым (1 - й) строка ввода в команде findstr

Теперь рассмотрим

(echo cat & echo dog) | findstr /n a

(то же, что и выше, но с добавленными скобками), что означает

  1. Сделать echo cat ,
    а потом
    сделать echo dog , и
  2. Возьмите вывод из вышеперечисленного и направьте его в findstr /n a

Так,

C:\> (echo cat & echo dog) | findstr /n a
1:cat

C:\> (echo cat & echo dog) | findstr /n o
2:dog

потому что вывод с левой стороны (# 1) командной строки

cat
dog

и «а» находится в строке 1 этого текста, а «о» находится в строке 2.  Мы больше не получаем выходную строку, которая говорит только cat (без номера строки), потому что echo cat больше не является автономной командой, а является частью группы, которая составляет левую сторону конвейера.

Вот более простой пример группировки команд:

C:\Temp> echo cat & echo dog > animals
cat

C:\Temp> type animals
dog

C:\Temp> (echo cat & echo dog) > animals

C:\Temp> type animals
cat
dog

И, конечно, как показано выше и в других ответах, вы можете добавить разрывы строк в группе:

C:\> (
More? echo cat
More? echo dog
More? ) | findstr /n a
1:cat

3. Создают ли скобки новый экземпляр CMD?

Я так не думаю; не каким-либо очевидным, значимым способом:

C:\> (cd windows)

C:\Windows> set a=aardvark

C:\Windows> (set a=bat)

C:\Windows> echo %a%
bat

Обратите внимание, что cd в скобках изменяет рабочий каталог основного процесса CMD, а set в скобках переопределяет значение переменной, которое было установлено вне скобок.

1

(И) подобны begin block и end block . Все, что вы можете поместить в командный файл (.bat), можно ввести в командной строке.

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

if "%1"=="" (
  echo Multiple
  echo Lines when no parameter
)
echo END

Теперь, когда я запускаю пакет без параметров, я получаю все команды между ( и ) для запуска. Когда подается первый параметр, единственным выходом является «END».

Теперь вернемся к командной строке: я не знаю ни хитростей, ни техник, которые могли бы на самом деле использовать это, вводя их непосредственно в командной строке. Но он, однако, следует тем же правилам. В командной строке, если введите следующее:

(echo "1" & echo "2")

Выход:

1
2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .