100개 언어 Speedrun: 에피소드 72: Windows 배치 파일

4912 단어 doswindows
확장자가 .bat인 배치 파일은 DOS와 같은 쉘 스크립트입니다.

DOS 버전(여전히 DOSBox에서 사용)은 매우 제한적이었고 숫자를 추가할 수도 없었습니다. OS/2 및 Windows NT부터 .bat 파일이 일부 매우 기초적인 스크립팅 기능으로 확장되었으므로 이것이 오늘 우리가 할 일이지만 이러한 확장 기능의 사용을 수학용으로만 set /a 사용하도록 제한하겠습니다. .

이 예제는 모든 Windows 시스템에서 실행할 수 있습니다. set /a 때문에 DOSBox에서 작동하지 않거나 DOS 시스템에서 작동하지 않습니다.

안녕하세요, 월드입니다!



다음과 같이 작성하여 시작할 수 있습니다hello.bat.

echo Hello, World!


불행히도 그것은 매우 성가신 일을 하고 그것을 실행하기 전에 모든 명령을 반향시킵니다. 디버깅에는 괜찮지만 대부분의 경우 실제로 원하는 것은 아닙니다.

C:\> hello

C:\> echo Hello, World!
Hello, World!

C:\>


명령 앞에 @를 넣어 수정하거나 @echo off 명령을 사용하여 반향을 완전히 비활성화할 수 있습니다.

@echo off
echo Hello, World!



C:\> hello2
Hello, World!

C:\>


나는 그 여분의 줄 바꿈이 어디에서 왔는지 아직 확실하지 않지만 지금은 그것에 대해 걱정하지 마십시오.

변수


set name=value 를 사용하여 변수를 설정하고 %name% 를 사용하여 다른 명령에 삽입할 수 있습니다.

@echo off
set name=Alice
echo Hello, %name%!



C:\> vars
Hello, Alice!

C:\>


이것은 우리가 DOSBox나 DOS 머신에서 여전히 그 예제를 실행할 수 있는 지점에 관한 것입니다. 이 시점부터 모든 Windows 확장입니다.

수학



DOS.bat 파일에는 수학을 할 수 있는 방법이 없었지만 Windows는 이에 대해 다음과 같이 추가했습니다set /a.

@echo off
set /a a = 40
set /a b = 380
set /a c = %a% + %b%
echo %c%



C:\> math
420

C:\>


고리




@echo off
set /a i = 1
:loop

echo %i%

set /a i = 1 + %i%

if %i% neq 11 goto :loop



C:\> loop
1
2
3
4
5
6
7
8
9
10

C:\>


여기에서 무슨 일이 일어나고 있습니까?
  • i의 초기 값을 1
  • 로 설정합니다.
  • 레이블이 있습니다 :loop
  • 모든 반복은 i의 현재 값을 반향합니다.
  • 그러면 i 1만큼 증가합니다.
  • i11와 같지 않으면 :loop로 이동합니다.

  • 피보나치



    함수는 어렵기 때문에 반복적인 해법을 해봅시다. 우리는 루프에서 많은 변수 할당과 추가를 수행합니다. 여기에는 새로운 기능이 필요하지 않습니다.

    @echo off
    set /a i = 1
    set /a a = 1
    set /a b = 1
    :loop
    
    echo fib(%i%)=%a%
    
    set /a i = 1 + %i%
    set /a c = %a% + %b%
    set /a a = %b%
    set /a b = %c%
    
    if %i% neq 21 goto :loop
    



    C:\> fib
    fib(1)=1
    fib(2)=1
    fib(3)=2
    fib(4)=3
    fib(5)=5
    fib(6)=8
    fib(7)=13
    fib(8)=21
    fib(9)=34
    fib(10)=55
    fib(11)=89
    fib(12)=144
    fib(13)=233
    fib(14)=377
    fib(15)=610
    fib(16)=987
    fib(17)=1597
    fib(18)=2584
    fib(19)=4181
    fib(20)=6765
    
    C:\>
    


    피즈버즈




    @echo off
    set /a i = 1
    
    :loop
    
    set /a fizzbuzz = %i% %% 15
    set /a fizz = %i% %% 3
    set /a buzz = %i% %% 5
    
    set /a t = %i%
    if %fizz% == 0 set t=Fizz
    if %buzz% == 0 set t=Buzz
    if %fizzbuzz% == 0 set t=FizzBuzz
    
    echo %t%
    
    set /a i = 1 + %i%
    if %i% neq 101 goto :loop
    



    C:\>fizzbuzz
    1
    2
    Fizz
    4
    Buzz
    Fizz
    7
    8
    Fizz
    Buzz
    11
    Fizz
    13
    14
    FizzBuzz
    16
    17
    Fizz
    19
    Buzz
    ...
    


    우리는 set 할 수 있는 것처럼 조건부로 goto 할 수 있습니다.

    FizzBuzz, 최신 버전



    지금까지는 DOS 기능과 set /a 만 사용했습니다. 그러나 Windows는 .bat 파일에 많은 기능을 추가했습니다. 이전 버전과의 호환성을 유지하기 위해 추가 기호와 스위치 뒤에 조심스럽게 게이팅했습니다.

    모든 기능을 사용하려는 경우 FizzBuzz는 다음과 같습니다.

    @echo off
    setlocal enableDelayedExpansion
    for /l %%j in (1 1 100) do (
      set /a fizz = %%j %% 3
      set /a buzz = %%j %% 5
      set /a fizzbuzz = %%j %% 15
      if !fizzbuzz! == 0 (
        echo FizzBuzz
      ) else if !buzz! == 0 (
        echo Buzz
      ) else if !fizz! == 0 (
        echo Fizz
      ) else (
        echo %%j
      )
    )
    


    그러나 이 시점에서 PowerShell을 사용하는 것이 좋습니다.

    Windows 배치 파일을 사용해야 합니까?



    아니요. Windows 시스템을 스크립팅해야 하는 경우 PowerShell이 ​​이미 있습니다. 더 복잡한 것이라면 실제 프로그래밍 언어를 사용하는 것이 좋습니다.

    암호



    All code examples for the series will be in this repository .

    Code for the Windows Batch Files episode is available here .

    좋은 웹페이지 즐겨찾기