Programing

Windows 배치 파일의 숨겨진 기능

lottogame 2020. 4. 14. 08:25
반응형

Windows 배치 파일의 숨겨진 기능


Windows 배치 파일의 덜 알려지지 만 중요하고 유용한 기능은 무엇입니까?

지침 :

  • 답변 당 하나의 기능
  • 문서에 대한 링크가 아니라 기능에 대한 간단한 설명예제 를 제공하십시오.
  • 기본 funtionality에 대한 답변 제한 , 즉 Windows Resource Kit 와 같은 추가 소프트웨어가 필요하지 않습니다.

설명 : 여기에서는 WinNT 변형의 기본값 인 cmd.exe로 처리되는 스크립트를 참조합니다.

(또한 Windows 배치 파일 : .bat 및 .cmd? 참조 )


줄 연속 :

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

PUSHD path

path로 지정된 디렉토리로 이동합니다 .

POPD

"밀어 넣은"디렉토리로 돌아갑니다.


배치 파일 에서 이것이 얼마나 유용한 지 잘 모르겠지만 명령 프롬프트에서 사용하는 것이 매우 편리한 명령입니다.

C:\some_directory> start .

"some_directory"폴더에 Windows 탐색기가 열립니다.

나는 이것이 훌륭한 시간 절약기를 발견했다.


나는 항상 각 줄에 키워드로 표시된 주석을 읽는 것이 어렵다는 것을 알았습니다.

REM blah blah blah

더 읽기 쉽다 :

:: blah blah blah

가변 부분 문자열 :

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456

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

"배관"탈출 :

echo ^| ^< ^> ^& ^\ ^^

bash에서 '$ ()'의 백틱과 같은 명령을 실행하고 출력을 처리 할 수 ​​있습니다.

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

파일 이름에 공백이 있으면 다음을 사용하십시오.

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i

빈 파일 만들기 :

> copy nul filename.ext

명령에서 모든 출력을 숨기려면> nul 2> & 1로 리디렉션하십시오.

예를 들어, 일부 명령 줄 프로그램은> nul로 리디렉션하더라도 출력을 표시합니다. 그러나 아래 줄과 같이 출력을 리디렉션하면 모든 출력이 억제됩니다.

PSKILL NOTEPAD >nul 2>&1

편집 : 작동 방법에 대한 설명은 명령 출력 무시를 참조하십시오 .


PAUSE

실행을 중지하고 다음 프롬프트를 표시합니다.

계속하려면 아무 키나 누르십시오. . .

Windows 탐색기에서 배치를 두 번 클릭하여 배치를 실행하고 명령 창의 플래시가 아니라 실제로 출력을 보려는 경우에 유용합니다.


배쉬 (및 다른 쉘)와 동등

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 fname=%date:/=%

... 타임 스탬프가 지정된 파일 이름에 사용하기 위해 날짜에서 "/"를 제거합니다.

하위 문자열도 ...

> @set dayofweek=%fname:~0,3%

정수 산술 :

> SET /A result=10/3 + 1
4

명령 구분 기호 :

cls & dir
copy a b && echo Success
copy a b || echo Failure

두 번째 줄에서 && 다음의 명령은 첫 번째 명령이 성공한 경우에만 실행됩니다.

세 번째 줄에서 || 다음의 명령 첫 번째 명령이 실패한 경우에만 실행됩니다.


빈 줄을 출력하십시오.

echo.

if 문을 연결하여 단락 부울`and '와 같은 효과를 얻을 수 있습니다.

if foo if bar baz

유니 코드 텍스트 파일 (16bit / char)을 ASCII DOS 파일 (8bit / char)로 빠르게 변환합니다.

C:\> type unicodeencoded.txt > dosencoded.txt

가능한 경우 보너스로 문자가 올바르게 매핑됩니다.


블록 구조 인 경우 :

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)

변수 확장 지연 (잘 측정하기 위해 하위 문자열을 던짐) :

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set full=/u01/users/pax
:loop1
    if not "!full:~-1!" == "/" (
        set full2=!full:~-1!!full2!
        set full=!full:~,-1!
        goto :loop1
    )
    echo !full!
    endlocal

많은 기능을 제공하지는 않지만 작업 표시 줄의 긴 스크립트에서 상태를 제공하거나 사용자 피드백을 향상시키는 것과 같이 몇 가지 용도로 title 명령을 사용할 수 있습니다.

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

편집기가 없어서 배치 파일을 만들어야합니까?

copy con test.bat

명령을 입력하고 Enter 키를 눌러 새 줄을 입력하십시오. Ctrl-Z와 Enter를 눌러 파일을 닫으십시오.


문자열 공제에의 예 datetime라는 이름의 파일을 얻을 "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 진수 값이 어디에서 0F, 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

참고 URL : https://stackoverflow.com/questions/245395/hidden-features-of-windows-batch-files

반응형