2012-02-22 2 views
1

입력 인수에서 dos 스크립트로 명령을 실행할 수 있습니까?dos 배치 스크립트에서 명령으로 입력 매개 변수를 실행 하시겠습니까?

단순화 된 스크립트 bla.bat :
  CALL % 1

전화 그것은 : bla.bat
"에코 '안녕하세요'"(또는 "자식 상태"bla.bat)

오류 :
'git status' '가 내부 또는 외부 명령으로 인식되지 않습니다. 작동 가능한 프로그램 또는 배치 파일 .

"CALL git status"를 실행하면 작동합니다.

답변

2

그것은 당신이 그것이 다른 % n 개의 인수로 파괴되는 것을 중지해야합니다 귀하의 의견에 주변 시세를 가지고,하지만 시도 할 수있는 문제는 다음과 같습니다

%~1 어떤 주변을 제거합니다 어느 입력에서 따옴표.

%~$PATH:1 모든 인용 부호를 제거하고 첫 번째 일치 항목에 대해 $ PATH env-var 내에서 검색 한 다음 명령에 대한 전체 경로를 포함하도록 문자열을 확장하면 Windows 배포판을 사용하는 자식에는 작동하지 않으므로 git은 배치 파일이고 cmd는 다음을 찾을 것입니다. git status.bat

git과 함께 사용하려면 % ~ 1 및 % ~ 2를 사용하여 git를 호출 한 다음 git 배치 파일에 인수를 제공하거나 $ PATH를 수정하여 직접 git.exe를 호출하십시오. 하지만 git.bat가 git 자체를 호출하기 전에 자체 환경 설정을 수행한다는 것을 기억하십시오.

+0

자세한 답변을 주셔서 감사합니다. ~ 문자를 추가하면 속임수를 쓰며 "힘내 상태"라고해도 충분했습니다. – edbras

1

매개 변수를 반향 출력하려면 %1%이 필요합니다. 여기에 당신이 원하는 것을 생각 내 절름발이 스크립트입니다, 당신의 echo 테스트와 함께 작동 :

bla echo hello 

을 제공합니다 :

C:\tmp>echo bla 
    bla 

    C:\tmp>echo echo 
    echo 

    C:\tmp>CALL echo hello 
    hello   

    echo %0% 
    echo %1% 
    CALL %* 

명령 행 인수를 구문 분석 할 경우, 알려주세요.

3

기억해야 할 중요한 점은 확장 된 텍스트는 명령 줄에서 명령을 입력하는 것과 똑같이 보여야한다는 것입니다. (실제로 몇 가지 예외가 있지만 이는 좋은 출발점입니다.)

스크립트를 디버깅하려면 호출하기 전에 에코를 넣으십시오 (@echo call %1). 이제 이전처럼 실행 해보십시오. blah.bat "echo 'hello'"call "echo 'hello'"입니다. 명령 줄에서 실행 해보십시오. 작동하지 않습니다. call echo 'hello'을 원합니다.한 당신이로합니다 (~ 수정 스트립 인수

@echo off 
call %~1 

에서 따옴표를 둘러싸 아니면 전화를 도랑 단순히 다음을 사용할 수 있습니다

한 수정은 약간 스크립트를 변경하는 것 당신이 반환하려는 또 다른 배치 파일) 명령 행에 다른 인수가없는 경우

@echo off 
%~1 

, 당신은 모든 인수로 확장 %*를 사용하여 더 나을 수도를 호출하지

@echo off 
%* 
REM or call %* 

이제 당신은 그 배치 가능성이 주위에 작업을 추가하거나 다른 코딩이 필요합니다 특별한 경우의 불확실성의 모든 종류가 알고 있어야합니다 그래서

blah.bat echo "hello" 

처럼 배치를 호출 할 수 있습니다. 목록에 너무 많습니다 - 예기치 않은 것을 기대하십시오.

0

문제는 매개 변수 사이에 공백이 생겨서 문제가되는 것입니다 (git 상태에서 따옴표를 사용하는 이유입니다).

명령 줄 매개 변수를 통해 반복하도록 bla.bat를 수정하십시오. 이것은 나를 위해 작동합니다 :

SETLOCAL ENABLEDELAYEDEXPANSION 

SET VAR1= 

FOR %%A IN (%*) DO (
    SET VAR1=!VAR1! %%A 
) 

call %VAR1% 

ENDLOCAL 

그런 다음 git 상태를 따옴표없이 bla.bat를 실행하십시오.

bla git status 

기본적으로, 어떤이하는 일은 명령 줄 매개 변수를 반복하고, 그 다음 하나의 명령으로 모두를 실행합니다. 도전 과제는 DOS의 FOR 루프가 자체에서 설정하는 변수를 사용할 수 없기 때문에 변수의 "지연된 확장"을 활성화해야합니다. 그런 다음, 설정중인 변수를 느낌표 (%가 아닌)에 캡슐화해야합니다. 그리고 물론, 사이의 공간! VAR1! %% A는 매개 변수가 CALL에서 함게 실행되지 않도록합니다.

+0

다른 사람들이 답변을 게시 한 것에 비추어 언급 할 필요가 있습니다. 내 길은 분명히 "긴"길입니다. CALL % * 또는 CALL % ~ 1을 수행하면 원하는 것을 수행해야합니다. – Aaron

관련 문제