Windows 배치 파일의 덜 알려지지 만 중요하고 유용한 기능에는 어떤 것이 있습니까?
지침 :
- 답변 당 하나의 기능
- 문서에 대한 링크뿐만 아니라 기능에 대한 간단한 설명 과 예제 를 제공하십시오.
- 기본 기능에 대한 답변을 제한합니다 . 즉, Windows Resource Kit 와 같은 추가 소프트웨어가 필요하지 않습니다.
설명 : 여기에서는 WinNT 변형의 기본값 인 cmd.exe로 처리되는 스크립트를 참조합니다.
Windows 배치 파일의 덜 알려지지 만 중요하고 유용한 기능에는 어떤 것이 있습니까?
지침 :
설명 : 여기에서는 WinNT 변형의 기본값 인 cmd.exe로 처리되는 스크립트를 참조합니다.
답변:
줄 연속 :
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf
. 그리고 해당 라인의 모든 매개 변수를 이해하려면 간단히 실행하십시오 C:\WINDOWS\system32\ntbackup.exe /?
.
PUSHD path
path로 지정된 디렉토리로 이동합니다 .
POPD
"밀어 넣은"디렉토리로 돌아갑니다.
배치 파일 에서 이것이 얼마나 유용한 지 잘 모르겠지만 명령 프롬프트에서 사용하는 것이 매우 편리한 명령입니다.
C:\some_directory> start .
"some_directory"폴더에 Windows 탐색기가 열립니다.
나는 이것이 시간을 절약 할 수 있다는 것을 알았습니다.
open .
경우에도 마찬가지입니다.
start
현재 폴더를 여는 것 이상을 수행합니다. 파일을 전달하면 구성된 뷰어에서 파일을 열 수 있습니다. URL을 입력하면 기본 브라우저가 열립니다.
나는 항상 각 줄에 키워드로 표시된 주석을 읽는 것이 어렵다는 것을 알았습니다.
REM blah blah blah
더 읽기 쉽다 :
:: blah blah blah
rem
문서화 된 키워드 동안은 ::
단지 구현 세부입니다. ::
작동을 멈출 것 같지는 않지만 일반적으로 문서화되지 않은 행동에 의존하지 않는 것이 좋습니다.
goto :
라벨로 건너 뛸 수도 있습니다 . :-)
및 goto -)
도 작동합니다.
가변 부분 문자열 :
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
for %a in ...
환경 변수처럼 닫는 백분율 부호를 필요로하지 않기 때문에 FOR 루프 ( ) 의 로컬 변수와 결합 될 수 없습니다 . 먼저 지연된 확장을 사용하여 환경 변수에 할당 한 다음 하위 문자열을 추출해야합니다.
FOR 명령 ! 배치 파일 작성을 싫어하지만 감사합니다.
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
세미콜론으로 시작하는 줄을 무시하고 myfile.txt의 각 줄을 구문 분석하고 쉼표 및 / 또는 공백으로 구분 된 토큰을 사용하여 각 줄에서 for 본문으로 두 번째 및 세 번째 토큰을 전달합니다. for body 문 참조 % i는 두 번째 토큰을 가져오고 % j는 세 번째 토큰을 가져오고 % k는 세 번째 이후의 나머지 토큰을 가져옵니다.
이것을 사용하여 디렉토리, 디렉토리 내용 등을 반복 할 수 있습니다 ...
REM 또는 :: 줄로 스크립트를 버리기보다는 각 스크립트의 맨 위에서 다음을 수행합니다.
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
파이프 및 리디렉션 문자를 이스케이프하지 않고 사용하는 방법에 유의하십시오.
스크립트가있는 경로 (드라이브 포함) : ~ dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
% ~ dp0 조각은 이미 언급되었지만 실제로 더 있습니다. ~ 뒤에 나오는 문자는 추출되는 정보를 정의합니다.
패치 파일 이름을 반환하는 문자 없음 결과
d-드라이브 문자
p를 반환합니다
.- 경로 s를 반환합니다.-짧은 경로를
반환합니다. x-파일 확장자를 반환합니다
. c : \ Temp에서 아래 test.bat 스크립트를 실행하면 \ long dir name \ 폴더,
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
당신은 다음과 같은 결과를 얻습니다
test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\
테스트 c : \ temp \ mysrc \ test.cpp
에서와 같이 매개 변수가 스크립트에 전달 되면 % 1 변수를 사용하여 동일한 조작을 수행 할 수 있습니다.
그러나 % 0의 확장 결과는 위치에 따라 다릅니다!
배치의 "최상위 수준"에서는 현재 배치 파일 이름으로 확장됩니다.
함수 (호출)에서는 함수 이름으로 확장됩니다.
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
출력은 배치 파일이 myBatch.bat로 시작됩니다.
myBatch.bat
:test
:test
myBatch
CALL, EXIT / B, SETLOCAL 및 ENDLOCAL을 사용하면 로컬 변수로 서브 루틴을 구현할 수 있습니다.
예:
@echo off
set x=xxxxx
call :sub 10
echo %x%
exit /b
:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b
이것은 인쇄됩니다
11
xxxxx
비록 : sub는 x를 수정합니다.
N 초 동안 대기하는 비열한 트릭 (cmd.exe의 일부는 아니지만 Windows와 함께 제공되므로 추가 소프트웨어는 아님), 핑 라인을 참조하십시오. 첫 번째 핑이 지연없이 나가기 때문에 N + 1 핑이 필요합니다.
echo %time%
call :waitfor 5
echo %time%
goto :eof
:waitfor
setlocal
set /a "t = %1 + 1"
>nul ping 127.0.0.1 -n %t%
endlocal
goto :eof
bash에서 '$ ()'의 백틱과 같은 명령을 실행하고 출력을 처리 할 수 있습니다.
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
파일 이름에 공백이 있으면 다음을 사용하십시오.
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
명령에서 모든 출력을 숨기려면> nul 2> & 1로 리디렉션하십시오.
예를 들어, 일부 명령 줄 프로그램은> nul로 리디렉션하더라도 출력을 표시합니다. 그러나 아래 줄과 같이 출력을 리디렉션하면 모든 출력이 억제됩니다.
PSKILL NOTEPAD >nul 2>&1
편집 : 작동 방법에 대한 설명은 명령 출력 무시를 참조하십시오 .
taskkill
있습니다.
PAUSE
실행을 중지하고 다음 프롬프트를 표시합니다.
계속하려면 아무 키나 누르십시오. . .
Windows 탐색기에서 배치를 두 번 클릭하여 배치를 실행하고 명령 창의 플래시가 아니라 실제로 출력을 확인하려는 경우에 유용합니다.
echo.|batch-with-pause.bat
'어떤 키'를 누르는 것과 같은 효과를 가질 것입니다 ...
배쉬 (및 다른 쉘)와 동등
echo -n Hello # or
echo Hello\\c
Hello
후행 줄 바꿈없이 " " 를 출력 합니다. 이 작업을 수행하는 cmd 핵 :
<nul set /p any-variable-name=Hello
set /p
사용자에게 입력을 요구하는 방법입니다. 주어진 문자열을 내 보낸 다음 사용자가 응답을 입력 할 때까지 (같은 줄에서, CRLF 없음) 기다립니다.
<nul
빈 응답을 set /p
명령에 파이프하기 만하면 결과는 생성 된 프롬프트 문자열입니다. 빈 응답으로 인해 사용 된 변수는 변경되지 않습니다.
문제는 다음과 같습니다. 선행 등호를 출력 할 수 없으며 Vista에서는 선행 공백 문자가 제거되지만 XP에서는 제거되지 않습니다.
정수 산술 :
> SET /A result=10/3 + 1
4
명령 구분 기호 :
cls & dir
copy a b && echo Success
copy a b || echo Failure
두 번째 줄에서 && 다음의 명령은 첫 번째 명령이 성공한 경우에만 실행됩니다.
세 번째 줄에서 || 다음의 명령 첫 번째 명령이 실패한 경우에만 실행됩니다.
유니 코드 텍스트 파일 (16bit / char)을 ASCII DOS 파일 (8bit / char)로 빠르게 변환합니다.
C:\> type unicodeencoded.txt > dosencoded.txt
가능한 경우 보너스로 문자가 올바르게 매핑됩니다.
블록 구조 인 경우 :
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
%ERRORLEVEL%
. 그게 다야 if errorlevel <foo>
. 그리고 그것은 실제로 그러한 블록에서 작동합니다.
많은 기능을 제공하지는 않지만 작업 표시 줄의 긴 스크립트에서 상태를 제공하거나 사용자 피드백을 향상시키는 것과 같이 몇 가지 용도로 title 명령을 사용할 수 있습니다.
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
문자열 공제에의 예 date
와 time
라는 이름의 파일을 얻을 "YYYY-MM-DD HH : MM : SS.txt"
echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"
내가 사용하는 color
내 스크립트가 성공적으로 끝날 경우 실패 나타 내기 위해, 또는 텍스트와 배경의 색상을 변경하여 일부 입력이 필요합니다. 그것은 당신이 볼 수있는 기계가 있지만 멀리 떨어져있을 때 실제로 도움이됩니다.
컬러 XY
X와 Y는 16 진수 값이 어디에서 0
에 F
, X 어디 - 배경, Y는 - 텍스트, X = Y 색상은 변경되지 않습니다 때.
컬러 Z
텍스트 색상을 'Z'로 변경하고 검정색 배경을 설정하면 '색상 0'이 작동하지 않습니다
색상의 이름은
색깔 ?
간격 및 이스케이프 문자로 출력을 완전히 제어합니다. :
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
The SoftwareJedi는 이미 for 명령을 언급했지만 매우 강력하므로 다시 언급하겠습니다.
다음은 현재 날짜를 YYYYMMDD 형식으로 출력합니다. 백업용 디렉토리를 생성 할 때 사용합니다.
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a