development

공백이있는 경로를 매개 변수로 bat 파일에 전달

big-blog 2020. 12. 10. 20:49
반응형

공백이있는 경로를 매개 변수로 bat 파일에 전달


알려진 디렉터리에서 사용자가 지정한 디렉터리로 파일을 복사하는 간단한 bat 스크립트가 있습니다. 내 스크립트에 경로 (공백이 포함될 수 있음)를 전달하고 xcopy 명령과 함께 사용하려면 어떻게해야합니까?


내 코드에는 다음이 있습니다.

:READ_PWA_PATH
    if "%1" == "" ( 
        rem Set default path
        set PWA_PATH="C:\Program Files\PWA"
        rem
        echo You have not specified your PWA url.
        echo Default will be assumed: C:\Program Files\PWA. 
        choice /C:YN /M:"Do you wish to continue [Y] or cancel the script [N]?"
            IF ERRORLEVEL ==2 GOTO CANCEL
            IF ERRORLEVEL ==1 GOTO READ_WSS_SERVER_EXTENSIONS_PATH
        GOTO END
    ) else (
        set PWA_PATH=%1
    )

단순히 스크립트를 호출하면 다음 오류가 발생합니다.

C:\Projects\Setup>install.cmd "C:\program files (x86)"

-----------------
SETUP SCRIPT
-----------------

files was unexpected at this time.
C:\Projects\Setup>

흥미로운 것. cmd / command에서 따옴표 처리에 대한 따옴표 수집을 좋아합니다.

특정 스크립트는 "% 1"대신 % 1을 (를) 사용하여 수정됩니다 !!!

'에코 켜기'(또는 에코 끄기 제거)를 추가하면 쉽게 알아낼 수 있습니다.


사용 "%~1". %~1혼자서 주변 따옴표를 제거합니다. 그러나 입력 매개 변수 %1에 따옴표가 있는지 여부를 알 수 없기 때문에 "%~1"확실히 추가되었는지 확인해야합니다. 이것은 변수를 연결할 때 특히 유용합니다.convert.exe "%~1.input" "%~1.output"


나는 OP의 문제는 그가 다음 두 가지를 모두 수행하고 싶다는 것이라고 생각합니다 .

  • 공백을 포함 할 수있는 매개 변수 전달
  • 매개 변수가 누락되었는지 테스트

여러 포스터에서 언급했듯이 공백이 포함 된 매개 변수를 전달하려면 실제 매개 변수 값을 큰 따옴표로 묶어야합니다.

매개 변수가 없는지 테스트하기 위해 제가 항상 배운 방법은 다음과 같습니다.

if "%1" == ""

그러나 실제 매개 변수가 따옴표로 묶인 경우 (값에 공백이 포함되어 있어야하므로) 이는

if ""actual parameter value"" == ""

"예기치 않은"오류가 발생합니다. 대신 사용하는 경우

if %1 == ""

그러면 인용 된 값에 대해 더 이상 오류가 발생하지 않습니다. 그러나이 경우 값이 누락되면 테스트 가 더 이상 작동하지 않습니다.

if  == ""

이 문제를 해결하려면 테스트에서 따옴표 대신 다른 문자 (DOS에 특별한 의미가있는 문자 제외)를 사용하십시오.

if [%1] == []
if .%1. == ..
if abc%1xyz == abcxyz

"% ~ 1"은 대부분의 경우 작동합니다. 그러나 이에 대해주의해야 할 몇 가지 사항이 있습니다.

  1. Windows NT 4.0에서는 지원되지 않습니다. Windows 2000 이상이 필요합니다. (이전 OS와 호환되는 스크립트를 코딩하는 경우주의하십시오.)
  2. 매개 변수를 안전하고 삭제하지 않습니다. 내 관찰은 CMD 스크립트에서 명령 줄 인수를 적절하게 삭제하는 방법없다는 것 입니다.

두 번째 요점을 설명하기 위해 예를 들어 보겠습니다.

REM example.cmd
ECHO %~1

으로 실행합니다 example.cmd dummy^&DIR. 앰퍼샌드는 여기서 ( ^&) 이스케이프 되어 쉘이 명령 구분 기호로 해석되지 않도록하여 스크립트에 전달 된 인수의 일부가됩니다. DIR은 스크립트를 실행하는 하위 쉘 내부의 명령으로 해석됩니다 .

인용하면 시간이 걸릴 수 있지만 여전히 안전하지 않습니다.

REM example2.cmd
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "arg1=%~1"
ECHO "%~1"
ECHO !arg1:"=!

example2.cmd foo^"^&DIR^&^"bar그것을 부술 것입니다. DIR 명령은 두 번 실행됩니다. 하나는 SET 직후에 다른 하나는 첫 번째 ECHO 직후에 실행됩니다. "%~1"잘 인용되었다고 생각하는 것이 논쟁 자체에 의해 인용되지 않는 것을 알 수 있습니다.

따라서 구문 분석 인수를 안전하게 만들 수있는 방법이 없습니다.

(편집 : EnableDelayedExpansionWindows NT 4에서도 작동하지 않습니다. 여기 정보 덕분에 http://www.robvanderwoude.com/local.php )


If you have a path with spaces you must surround it with quotation marks (").

Not sure if that's exactly what you're asking though?


@echo off
setlocal enableextensions enabledelayedexpansion

if %1=="" (     
        rem Set default path
        set PWA_PATH="C:\Program Files\PWA"
        rem
        echo You have not specified your PWA url.
        echo Default will be assumed: C:\Program Files\PWA.     
        choice /C:YN /M:"Do you wish to continue [Y] or cancel the script [N]?"
                IF ERRORLEVEL ==2 GOTO CANCEL
                IF ERRORLEVEL ==1 GOTO READ_WSS_SERVER_EXTENSIONS_PATH
        GOTO END
    ) else (
        set PWA_PATH=%1
        @echo !PWA_PATH! vs. %1
        goto end
    )
:READ_WSS_SERVER_EXTENSIONS_PATH
echo ok
goto end
:CANCEL
echo cancelled
:end
echo. final %PWA_PATH% vs. %1

As VardhanDotNet mentions, %1 is enough.

"%1%" would add quotes around quotes: ""c:\Program Files\xxx"" which means:

  • 'empty string' (""),
  • followed by 'c:\Program',
  • followed by the "unexpected here" 'Files\xxx',
  • followed by an empty string ("")

Note however that if you need to use PWA_PATH within your IF clause, you need to refer if as !PWA_PATH! (hence the enabledelayedexpansion as the beginning of the script)


If your path contains space then try using %~s1. This will remove the space and appends ~1 to your path and more importantly it refers to the absolute path of your file. Try using it.

참고URL : https://stackoverflow.com/questions/473117/pass-path-with-spaces-as-parameter-to-bat-file

반응형