이 FOR 명령의 출력에 문제가 있습니다.

이 FOR 명령의 출력에 문제가 있습니다.

방금 이 레지스트리 키에서 처음에 bat 파일을 실행하고 있다는 것을 깨달았습니다. 그 키 echo running abc와 다른 관련 없는 것들이 있었습니다.

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

그래서 여기서 나는 그 bat 파일을 수정했습니다. 그것은 단지 한 줄에 불과하며 관련이 없습니다.

bat 파일의 내용을 볼 수 있습니다.

다음은 동일한 근본적인 문제이지만 문제를 재현할 수 있어야 하는 상황을 보여주는 cmd 프롬프트의 일부 출력입니다.

이제 질문은,

  • 왜 echo sss라고 표시되고 echo sss ttt는 표시되지 않나요?
  • FOR를 사용하여 cmd 또는 해당 초기화 bat 파일의 실행을 억제하려면 어떻게 해야 합니까? FOR 문은 실제로 "echo sss" 또는 "echo sss ttt"가 아닌 "echo g"만 표시해야 합니다.

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\

C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt   

C:\>  

C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>

C:\>echo sss
sss

C:\>echo g
g

C:\>

답변1

왜 echo sss라고 표시되고 echo sss ttt는 표시되지 않나요?

줄에 sss ttt공백 문자가 포함되어 있기 때문입니다. 명령은 for이를 토큰화하고 전반부는 변수 sss에 저장 %f하고 후반부는 변수 ttt에 저장합니다 %g.

FOR를 사용하여 cmd 또는 해당 초기화 bat 파일의 실행을 억제하려면 어떻게 해야 합니까? FOR 문은 실제로 "echo sss" 또는 "echo sss ttt"가 아닌 "echo g"만 표시해야 합니다.

새로운 명령 해석기를 평가하기 위해 echo g ^| findstr "g"초기화되고 \blah\startfile.bat자동으로 실행되는 것 같습니다. 배치에서 아무것도 출력하지 않도록 만드세요.

답변2

배치 파일에서 사용하려면 %f다른 것으로 이스케이프해야 합니다 %.

for /f %%f in ('echo g ^| findstr "g"') do echo %%f

이를 배치 파일에 넣으면 원하는 결과를 얻을 수 있습니다.

답변3

Vlastimil의 답변을 조금 확장하려면 ...

FOR명령은 다음을 실행합니다."echo g"출력을 다음으로 파이프합니다.findstr,을 위한먼저 새로운 명령 프로세서를 시작해야 합니다.\blah\startfile.bat실행됩니다.

\blah\startfile.bat다음을 포함하는 라인을 출력합니다.sss ttt. 해당 라인은 다음에 의해 처리됩니다.을 위한그리고는아니다전달findstr.

에 대한 도움말에 따르면을 위한:

처리는 ...로 구성되며, 텍스트를 개별 텍스트 줄로 나눈 다음 각 줄을 0개 이상의 토큰으로 구문 분석합니다. 그런 다음 for 루프의 본문은 발견된 토큰 문자열로 설정된 변수 값을 사용하여 호출됩니다. 기본적으로 /F는 각 줄에서 공백으로 구분된 첫 번째 토큰을 전달합니다.

기본 구분 기호을 위한이다:" ,;"(공백 쉼표 및 세미콜론).

첫 번째 줄은을 위한프로세스에는 다음 문자열이 포함됩니다.으아아아아아아. 해당 문자열에는" "(공백)은 기본 구분 기호입니다.을 위한, 행을 구문 분석하고 첫 번째 토큰 문자열을 할당합니다."쯧쯧"에게"%에프". 그래서"에코 %f"다음만을 사용하여 라인을 출력합니다."쯧쯧". 이것이 인쇄된 첫 번째 줄입니다. 그만큼"으으으"단순히 폐기되기 때문에"...에코 %f"명령은 첫 번째 토큰 이상의 것을 포함하도록 지정하지 않았습니다.

만약을 위한명령이 다르게 작성되었습니다. 전체 줄을 보았을 것입니다."쯧쯧쯧"울렸다.

다음은 3가지 방법입니다.을 위한그렇게 하기 위해 명령을 작성할 수도 있습니다.

첫 번째 방법은"delims="옵션에서 구분 기호를 설정합니다.을 위한"비어"로, 그래서을 위한전체 라인을 1 토큰으로 반환합니다. 토큰은 계속 구문 분석되며 모든 구분 기호(" ,;")가 제거되면 모든 토큰이 각 토큰 사이에 공백으로 다시 결합됩니다. 이 결합된 값은 변수에 반환됩니다."%에프"

C:\>for /f "delims=" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\>echo mm nn oo ss tt
mm nn oo ss tt

다음 방법은"tokens=*"옵션, 알려줍니다을 위한발견된 모든 토큰을 지정된 변수의 값에 넣습니다("%에프"). 토큰은 여전히 ​​구문 분석되고 모든 구분 기호가 제거된 다음 모든 토큰이 각 토큰 사이의 공백으로 다시 결합됩니다.

C:\>for /f "tokens=*" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt

이 세 번째 방법은"tokens=1,*"옵션, 알려줍니다을 위한발견된 첫 번째(1) 토큰을 지정된 변수의 값에 넣습니다("%에프"). 그리고 나머지 토큰을 구문 분석하고 모든 구분 기호를 제거한 다음 남은 모든 토큰을 각 토큰 사이의 공백으로 다시 결합하고 이 결합된 값을 지정된 변수 이름 뒤에 오는 문자로 명명된 변수에 반환합니다(따라서 이 경우 변수"%g").

C:\>for /f "tokens=1,*" %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"

C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"

지정된 변수 이외의 변수에 대해 정의된 "tokens="가 없기 때문에 다음은 작동하지 않습니다."%에프":

C:\>for /f %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss %g
sss %g


따라서 귀하의 예에서"delims="옵션을 선택하면 다음과 같이 표시됩니다.

C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f

C:\>echo sss ttt
sss ttt

C:\>echo g
g

C:\>

관련 정보