Що означає "(" означає у cmd


4

Всякий раз, коли я набираю (, тобто відкриваюча дужка в командний рядок , це відбувається:

(
More? 

Якщо я продовжу друкувати ( або будь-який інший символ , це підказує мені з тим же повідомленням. Це зупинено , якщо я ввійду ), тобто закриваюча дужка , хоча я отримую помилку, яка говорить:

) was unexpected at this time

Крім цього, я не вдалося знайти те, що робить ця команда . Будь-які ідеї, що він робить?


2
Дужки можна використовувати для розділення команд на декілька рядків, але, можливо, хтось може дати вам більш повну відповідь.
User552853

@ User552853 Не дуже. Коли з'являється "more", це більше пов'язано з (і, можливо, тільки з ним), є неповна команда. Наприклад, парен не допоможе - ви не можете робити, наприклад, dir (& lt; new line & gt;) / p Таким чином, дужки не допомагають розділити команду на кілька рядків. Насправді каретка використовується для розбиття будь-якої команди на декілька рядків. Спробуйте echo ^ і він скаже "Більше?". Круглі дужки втручаються в команду (якщо команда не використовує їх).
barlop

За іронією долі, якщо ви покладете (в лапках, як випливає з назви вашого питання, то ви не отримаєте «More».
barlop

Відповіді:


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) як одну команду і навіть як би він з'явився в одній лінії.


я погоджуся () використовується для групування команд, але, можливо, не тільки цього. Як щодо for %f in (*.txt) do echo %f Батьки не можуть групувати команди, і якщо ви вилучите батьків звідти, ви отримаєте синтаксичну помилку.
barlop

Команди між () фактично виконуються в окремому екземплярі CMD ? Дійсно? Увімкніть диспетчер завдань ...
JosefZ

@barlop () у FOR IN () є частиною синтаксису самого FOR. Якщо ви дотримуєтеся, що з DO (), дужки, які йдуть з DO, знову групують дужки.
Tonny

@JosefZ Логічний примірник з окремою областю для напр. setlocal. Це не новий процес.
Tonny

@Tonny, що ви маєте на увазі "логічний приклад"? як він виглядав, якби це не був новий "логічний приклад"? Чи можете ви вказати на що-небудь на Google, що згадує цю річ, про яку ви згадуєте (створення нового "логічного прикладу"?
barlop

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, в цьому випадку). Якщо видалити дужки, ви отримаєте синтаксичну помилку. Я не говорю про це.

Як зазначено ad nauseam , круглі дужки групи команд. Розглянемо цей командний рядок:

echo cat & echo dog | findstr /n a

Це означає

  1. Зробіть echo cat, і потім
  2. Зробіть echo dog | findstr /n a
    Оскільки слово "собака" не містить літери "а", ця команда не дасть виводу.

Відповідно, вихід для вищезгаданого є

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

Аналогічно

C:\> echo cat & echo dog | findstr /n o
cat
 1:  собака 

в якому ми отримуємо додаткові 1: собака вихід, тому що "собака" робить містити "o", і "собака" є першим ( 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:  кіт

C: \ t (ехо-собака) findstr / n o  2:  собака 

тому що вихід з лівого боку (# 1) командного рядка

cat
dog

і "a" знайдено на лінії 1 цього тексту, і "o" знайдено на лінії 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:  кіт 

3. Чи створюють дужки нові екземпляри CMD?

Я так не думаю; не будь-яким очевидним, значущим чином:

C:\> (cd windows)

C:\Windows> set a=aardvark

C:\Windows> (set a=bat)

C:\Windows> echo %a%
bat

Зверніть увагу, що cd у дужках змінює робочий каталог основного процесу CMD, і set у дужках перевизначає значення змінної, встановлене за межами дужок.


1

(І) подібні до a begin block і end block. Все, що ви можете помістити в пакетний файл (.bat), можна набрати в командному рядку.

Наприклад, я можу написати пакетний файл з може поставити блок операторів в if:

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

Тепер, коли я запускаю партію без параметрів, я отримую всі команди між ( і ) бігти. Коли подається перший параметр, єдиний вихідний параметр - END.

Тепер повернемося до командного рядка: я не знаю ніяких хитрощів або методів, які б використовували це, безпосередньо набравши командний рядок. Проте, однак, дотримуються тих самих правил. У командному рядку введіть наступне:

(echo "1" & echo "2")

Вихід:

1
2

Ваш другий приклад показує, що ваше перше речення неправильне або неточне, оскільки навіть якщо це було правильно, вони не тільки для початкового блоку та кінцевого блоку з кількома рядками. Ви можете зробити IF на одному рядку з дужками теж.
barlop

Крім того, причина, чому відкрита дужка іноді може дозволити вам почати нову лінію, не стосується відкриття або закінчення блоку. Наприклад, це відбувається і з for %f in ( І неробоча частина 'для' (в тій мірі, в якій будь-яка типова термінологія програмування може бути застосована до неї) не вважається блоком.
barlop

Примітка - коли я писав "другий приклад", я мав на увазі ((echo "1" & ech "2") і до речі немає причин ставити 1 і 2 в лапки.
barlop

Дякуємо за нотатки. Я повністю згоден у другому прикладі, що немає необхідності в котируваннях. Я намагався вказати на те, що така ж поведінка працює в командному рядку, як усередині пакетного файлу. BTW я був би дуже зацікавлений, якщо хтось може додати командний рядок, який повинен мати (), щоб працювати правильно.
miltonb

1
milton, ти написав "Я був би дуже зацікавлений, якщо хтось може додати командний рядок, який повинен мати (), щоб працювати правильно" У відповідь, це буде прикладом for %f in (*.*) do echo %f Отже, видалення парень призводить до того, що команда не виконуватиметься.
barlop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.