cmd에서 "(")의 의미


4

내가 입력 할 때마다 (, 즉, 여는 괄호 에서 명령 프롬프트 ,이 문제가 발생합니다 :

(
More? 

계속 입력 ( 하거나 다른 문자를 입력 하면 동일한 메시지가 표시됩니다. 이는 정지 , 내가 입력 한 경우 ), 즉, 닫는 괄호 , I라는 오류를받을 수 있나요 있지만 :

) was unexpected at this time

그 외에는 이 명령이하는 일을 찾지 못했습니다 . 어떤 아이디어가 있습니까?


2
괄호를 사용하여 여러 줄로 명령을 나눌 수 있지만 다른 사람이 더 완전한 대답을 줄 수 있습니다.
552853

실제로는 아닙니다. "more"가 나타나면 불완전한 명령이있는 것입니다. Parens는 여기에 도움이되지 않습니다-예를 들어 dir (<new line>) / p를 수행 할 수 없으므로 괄호는 명령을 여러 줄로 나누는 데 도움이되지 않습니다. 실제로 캐럿은 여러 줄에 걸쳐 모든 명령을 분할하는 데 사용됩니다. 시도 echo ^하고 "More?"라고 표시됩니다. 둥근 괄호는 명령을 방해합니다 (명령이 어쨌든 사용하지 않는 한).
barlop

아이러니하게도 (질문의 제목과 같이 따옴표로 묶으면 '더보기'를 얻지 못하고 (리터럴로 처리됩니다.
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

@ 토니 "논리적 인스턴스"는 무엇을 의미합니까? 새로운 "논리적 인스턴스"가 아닌 경우 어떻게 보였습니까? 구글에서 당신이 언급 한 새로운 "논리적 인스턴스"를 언급하는 것을 언급 할 수 있습니까?
barlop

4

좋은 많은 정보는 이미 여기에 게시되어 있습니다 - 예를 들어, 괄호가있다 "는 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
    단어 "개"는 문자 "A"를 포함하지 않기 때문에,이 명령은 출력을 생성하지 않습니다.

따라서 위의 출력은

C : \> 에코 고양이 & 에코 개 | findstr / na
고양이

비슷하게,

C : \> 에코 고양이 & 에코 개 | findstr / 아니
고양이
1 :

1:dog"dog" 에는 "o " 포함되어 있고 "dog"은 명령에 대한 첫 번째 ( 1 ) 입력 라인 이므로 추가 출력 을 얻습니다 findstr.

이제 고려

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

(위와 동일하지만 괄호가 추가됨)

  1. 수행 echo cat,
    다음
    을 수행 echo dog하고,
  2. 위의 출력을 가져 와서 파이프에 넣습니다. findstr /n a

그래서,

C : \> (에코 고양이 & 에코 개) | findstr / na
 1 : 고양이

C : \> (에코 고양이 & 에코 개) | findstr / 아니
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 : \> (
더? 에코 고양이
더? 에코 개
더? ) | 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괄호 안에 괄호 밖에서 설정된 변수 값을 대체합니다.


2

(와)는 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

또한 열린 Parens가 때로는 새로운 라인을 시작할 수있는 이유는 블록을 열거 나 끝내는 것과 관련이 없기 때문입니다. 예를 들어 그것은 또한 발생 for %f in ( 하며 'for'의 비 수행 부분 (일반적인 프로그래밍 용어를 적용 할 수있는 정도)은 일반적으로 블록으로 간주되지 않습니다.
barlop

참고 – "두 번째 예"를 쓸 때 나는 ((echo "1"& echo "2")를 언급하고 있었는데 btw는 1과 2를 인용 할 이유가 없습니다.
barlop

메모 주셔서 감사합니다. 나는 두 번째 예에서 따옴표가 필요 없다는 것에 전적으로 동의합니다. 배치 파일 내부와 동일한 동작이 명령 줄에서 작동한다는 것을 지적하려고했습니다. BTW 누군가가 ()가 올바르게 작동 해야하는 명령 줄을 추가 할 수 있다면 매우 관심이 있습니다.
miltonb

1
밀턴, 당신은 "누군가 ()가 제대로 작동해야하는 명령 줄을 추가 할 수 있다면 매우 흥미로울 것"이라고 썼다 for %f in (*.*) do echo %f .
barlop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.