명령 행 출력 억제
다음과 같은 간단한 배치 파일이 있습니다.
에코 taskkill / im "test.exe"/ f> nul 중지
"test.exe"가 실행되고 있지 않으면이 메시지가 나타납니다.
오류 : 프로세스 "test.exe"를 찾을 수 없습니다.
출력을 NUL로 리디렉션 했는데도이 오류 메시지가 표시되는 이유는 무엇입니까?
그 출력을 어떻게 억제 할 수 있습니까?
오류 메시지가 자주 표시 stderr
되지 않기 때문 stdout
입니다.
호출을 다음과 같이 변경하십시오.
taskkill /im "test.exe" /f >nul 2>&1
그리고 모든 것이 더 나을 것입니다.
stdout
파일 설명자 1 이기 때문에 작동 stderr
하며 규칙에 따라 파일 설명자 2입니다. (0은 stdin
실수로 발생합니다.) 2>&1
새로운 값 1에서 출력 파일 디스크립터 2를 복사합니다 .이 값은 널 장치로 리디렉션되었습니다.
이 구문은 많은 유닉스 셸에서 빌려온 것이지만 셸 구문과 CMD.EXE 사이에는 미묘한 차이가 있으므로주의해야합니다.
업데이트 : OP NUL
가 여기에 쓰고 있는 "파일"의 특수 특성을 이해한다는 것을 알고 있지만 주석 작성자는 그 점에 대해 자세히 설명하지 않았습니다.
MSDOS의 초기 릴리스로 돌아가서 특정 파일 이름은 파일 시스템 커널에 의해 선점되어 장치를 참조하는 데 사용되었습니다. 그 이름의 최초의 목록을 포함 NUL
, PRN
, CON
, AUX
과 COM1
를 통해 COM4
. NUL
널 장치입니다. 항상 읽기 또는 쓰기를 위해 열 수 있으며, 모든 양을 쓸 수 있으며 읽기는 항상 성공하지만 데이터는 반환하지 않습니다. 다른 프린터로는 병렬 프린터 포트, 콘솔 및 최대 4 개의 직렬 포트가 있습니다. MSDOS 5부터는 예약 된 이름이 몇 개 더 있지만 기본 규칙은 매우 잘 정립되었습니다.
Windows가 만들어 졌을 때 MSDOS 커널 위에서 상당히 얇은 응용 프로그램 전환 계층으로 시작되었으므로 파일 이름 제한이 동일했습니다. 윈도우 NT는 그 자체에 진정한 운영체제로 만들 때, 이름을 좋아 NUL
하고 COM1
너무 널리 제거를 허용하는 작업을 가정했다. 그러나 새로운 장치가 항상 실제 파일에 대한 해당 이름의 미래 사용자를 차단하는 이름을 얻는다는 생각은 명백하지 않습니다.
Windows NT와 그 이후의 모든 버전 (2K, XP, 7, 8)은 모두 커널 코드에서 훨씬 더 정교한 NT 네임 스페이스 를 사용하며 신중하게 구성되고 이식성이 뛰어난 사용자 공간 코드에 사용됩니다. 해당 네임 스페이스에서 장치 드라이버는 \Device
폴더를 통해 볼 수 있습니다 . 필요한 이전 버전과의 호환성을 지원하기 위해 \DosDevices
파일 시스템 폴더에 예약 된 파일 이름 목록을 구현하는 폴더를 사용하는 특별한 메커니즘이 있습니다. 사용자 코드는 일반적인 Win32 API 아래의 API 계층을 사용하여이 내부 네임 스페이스를 찾아 볼 수 있습니다. 커널 네임 스페이스를 탐색하기에 좋은 도구 는 Microsoft SysInternals 그룹의 WinObj 입니다.
Windows에서 합법적 인 파일 (및 장치) 이름과 관련된 규칙에 대한 자세한 설명을 보려면 MSDN의이 페이지가 유익하고 까다 롭습니다. 규칙이 있습니다 많은 더가되어야한다보다 복잡하고는 "시간이 가장 긴 법적 완전한 경로 이름은?"과 같은 몇 가지 간단한 질문에 답변을 실제로 불가능하다.
대신이 스크립트를 사용하십시오.
@taskkill/f /im test.exe >nul 2>&1
@pause
뭐라고 2>&1
부분은 실제로 않습니다, 그것은 리디렉션이다 stderr
출력을 stdout
. 아래에서 더 잘 설명하겠습니다.
@ taskkill / f / im test.exe> nul 2> & 1
작업 "test.exe"를 종료하십시오. 로 리디렉션 stderr
하십시오 stdout
. 그런 다음로 리디렉션 stdout
하십시오 nul
.
@중지
Press any key to continue . . .
누군가 키를 누를 때까지 일시 정지 메시지를 표시하십시오 .
참고 : @
기호는 각 명령에 대한 프롬프트를 숨 깁니다. 이 방법으로 최대 8 바이트를 절약 할 수 있습니다.
스크립트의 가장 짧은 버전은 다음과 같습니다
@taskkill/f /im test.exe >nul 2>&1&pause
. &
문자는 처음으로 리디렉션하고 두 번째로 명령을 분리하는 데 사용됩니다.
한 줄에 @
문자가 두 번 필요하지 않습니다. 게시 한 코드는 49 바이트이지만이 코드는 40 바이트입니다! 실제로 9 바이트를 절약했습니다. 깔끔한 코드는 위를 참조하십시오.
mysqldump는 다음과 함께 작동하지 않습니다 : > nul 2> & 1
대신 사용 : 2> nul
stderr 메시지를 억제합니다 : "경고 : 명령 행 인터페이스에서 암호를 사용하는 것은 안전하지 않습니다"
대신이 작업을 수행 할 수도 있습니다.
tasklist | find /I "test.exe" > nul && taskkill /f /im test.exe > nul
참고URL : https://stackoverflow.com/questions/1262708/suppress-command-line-output
'IT박스' 카테고리의 다른 글
Android 용 Eclipse에서 ProGuard 활성화 (0) | 2020.07.27 |
---|---|
매개 변수를 통한 캐시 버스 팅 (0) | 2020.07.27 |
leiningen-지역 항아리에 의존성을 추가하는 방법? (0) | 2020.07.27 |
Oracle의 CREATE OR REPLACE VIEW에 해당하는 SQL Server (0) | 2020.07.27 |
위도 / 경도 및 km 거리 작업을위한 간단한 계산? (0) | 2020.07.27 |