![Что означает "(" в cmd](https://rvso.com/image/1525442/%D0%A7%D1%82%D0%BE%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%20%22(%22%20%D0%B2%20cmd.png)
Всякий раз, когда я печатаю (
, т.е.открывающая скобкавКомандная строка, Бывает:
(
More?
Если я продолжу печатать(
или любой другой персонаж, он выдает мне то же самое сообщение.Это остановлено, если я ввожу )
, т.е.закрывающая скобка, хотя я получаю сообщение об ошибке:
) was unexpected at this time
Кроме этого, яне удалось найти, что делает эта команда. Есть идеи, что он делает?
решение1
() на самом деле не команда, а оператор группировки, который позволяет вам группировать последовательность команд вместе, чтобы использовать ее там, где оболочка 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) как одну команду и даже так, как если бы он находился на той же строке.
решение2
Здесь уже было размещено много полезной информации — например, скобки«Оператор группировки, позволяющий группировать последовательность команд для использования ее там, где оболочка 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
Это значит
- Сделай
echo cat
, а потом - Поскольку
echo dog | findstr /n a
слово «dog» не содержит буквы «a», эта команда не выведет ничего.
Соответственно, вывод для вышеизложенного следующий:
C:\> echo cat & echo dog | findstr /na кот
Сходным образом,
C:\> echo cat & echo dog | findstr /no кот 1:собака
в котором мы получаем дополнительный 1:dog
вывод, потому что «собака»делаетсодержат «о», а «собака» — первая (1st) строка ввода команды findstr
.
Теперь рассмотрим
(echo cat & echo dog) | findstr /n a
(то же самое, что и выше, но с добавленными скобками), что означает
- Делай
echo cat
,
а затем
делайecho dog
, и - Возьмите вывод из вышеприведенного и направьте его в
findstr /n a
Так,
C:\> (echo cat & echo dog) | findstr /na 1:кот C:\> (echo cat & echo dog) | findstr /no 2:собака
потому что вывод с левой стороны (#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
И, конечно же, как показано выше и в других ответах, вы можете добавлять переносы строк внутри группы:
С:\> ( Больше? эхо кот Больше? эхо собака Еще? ) | findstr /na 1:кот
3. Создают ли скобки новый экземпляр CMD?
Я так не думаю; не в какой-либо очевидной и значимой форме:
C:\> (cd windows)
C:\Windows> set a=aardvark
C:\Windows> (set a=bat)
C:\Windows> echo %a%
bat
Обратите внимание, что cd
в скобках изменяет рабочий каталог основного процесса CMD, а set
в скобках переопределяет значение переменной, установленное за пределами скобок.
решение3
( и ) похожи на begin block
и end block
. Все, что можно поместить в пакетный файл (.bat), можно ввести в командной строке.
Например, я могу написать пакетный файл, который может поместить блок операторов в if
:
if "%1"=="" (
echo Multiple
echo Lines when no parameter
)
echo END
Теперь, когда я запускаю пакет без параметров, я получаю все команды между (
и )
для запуска. Когда указан первый параметр, единственным выходом является 'END'.
Теперь вернемся к командной строке: я не знаю никаких трюков или приемов, чтобы использовать это напрямую, набирая в командной строке. Но это, однако, следует тем же правилам. Если в командной строке ввести следующее:
(echo "1" & echo "2")
Вывод:
1
2