공백이있는 경로를 매개 변수로 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"은 대부분의 경우 작동합니다. 그러나 이에 대해주의해야 할 몇 가지 사항이 있습니다.
- Windows NT 4.0에서는 지원되지 않습니다. Windows 2000 이상이 필요합니다. (이전 OS와 호환되는 스크립트를 코딩하는 경우주의하십시오.)
- 매개 변수를 안전하고 삭제하지 않습니다. 내 관찰은 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"
잘 인용되었다고 생각하는 것이 논쟁 자체에 의해 인용되지 않는 것을 알 수 있습니다.
따라서 구문 분석 인수를 안전하게 만들 수있는 방법이 없습니다.
(편집 : EnableDelayedExpansion
Windows 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
'development' 카테고리의 다른 글
Android 오류 빌드 서명 된 APK : 'externalOverride'구성 서명에 대한 keystore.jks를 찾을 수 없음 (0) | 2020.12.10 |
---|---|
IIS : 모든 요청을 한 페이지로 리디렉션 하시겠습니까? (0) | 2020.12.10 |
파일에서 줄을 찾아 제거 (0) | 2020.12.10 |
Parcelable을 비 정렬 화하는 문제 (0) | 2020.12.10 |
쿠키의 만료 시간을 얻는 방법 (0) | 2020.12.10 |