source

Windows 배치 파일의 숨겨진 기능입니다.

manysource 2023. 4. 25. 22:36

Windows 배치 파일의 숨겨진 기능입니다.

Windows 배치 파일의 중요하면서도 유용한 기능은 무엇입니까?

가이드라인은 다음과 같습니다.

  • 답변당 하나의 기능이 있습니다.
  • 설명서에 대한 링크뿐만 아니라 기능에 대한 간단한 설명과 예를 모두 제공합니다.
  • 답변을 기본 기능으로 제한합니다. 즉, Windows 리소스 키트와 같은 추가 소프트웨어가 필요하지 않습니다.

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

다음을 참조하십시오.윈도우즈 배치 파일: .bat vs .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

경로별로 지정된 디렉터리로 이동합니다.

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, 세미콜론으로 시작하는 행을 무시하고 각 줄에서 두 번째 및 세 번째 토큰을 쉼표 및/또는 공백으로 구분하여 본문으로 전달합니다.두 번째 토큰을 얻으려면 %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를 반환합니다.
- pathp - 로로니다 the니다 the 오다를 반환합니다.
s - 짧은 경로를 반환합니다.
- 파일 확장자 x - the -확를 the the the the the the the the the를 반환합니다.
따라서 아래 스크립트 test.bat을 c: 에에 c 에 test.bat에서 실행하면 test.bat이 실행됩니다.\Temp\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\

그리고 스크립트에 매개 변수가 전달되는 입니다.
test c:\disc\mysrc\test.cppsc:\disc\mysrc\test.cppsada를 합니다.
%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와 함께 제공되므로 추가 소프트웨어도 아님)는 ping 줄을 참조하십시오.첫 번째 ping이 지연 없이 전송되므로 N+1 ping이 필요합니다.

    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

EDIT: 명령 출력 무시를 참조하십시오. 명령어 출력 무시를 참조하십시오.

PAUSE

실행을 중지하고 다음 메시지를 표시합니다.

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

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

bash(및 기타 셸)와 동일합니다.

echo -n Hello # or
echo Hello\\c

이렇게 해서 '이렇게 하다'를출력합니다.Hello이렇게 '어느 정도'라고 합니다.이렇게 해서 cmd hack 을 사용합니다.

<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.

짧은 순환 부울 'and'와 같은 효과를 얻기 위해 문을 체인으로 연결할 수 있습니다.

if foo if bar baz

유니코드 텍스트 파일(16비트/char)을 ASCII DOS 파일(8비트/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 키를 눌러 파일을 닫습니다.

문자열 감산 예제입니다.date그리고.time"YYY-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 - background, Y - text는 X = Y 색상이 변경되지 않습니다.

Z를 색칠합니다.

텍스트 색상을 'Z'로 변경하고 배경을 검은색으로 설정합니다. 'color 0'은 작동하지 않습니다.

색상 이름을 알고 싶으면 전화하세요.

색상은요?

공백 및 이스케이프 문자를 사용하여 출력을 완전히 제어합니다.

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>

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 입니다.