HOWTO · Batch
Batch 파일의 변수에서 큰따옴표 제거하기
%~1, 변수 치환 또는 FOR /F를 사용하여 Batch 파일 변수의 큰따옴표를 제거하는 방법을 설명합니다.
이 페이지의 내용
Batch 인수의 바깥쪽 따옴표는 %~1로 제거합니다. 변수 안의 모든 큰따옴표를 제거하려면 %variable:"=%를 사용하고, 바깥쪽 한 쌍만 제거하려면 FOR /F와 %~A를 사용합니다. 세 방법은 서로 다른 동작을 합니다. 아래 예제는 set "name=value" 형식을 사용하며 공백, 특수 문자, 빈 값, 지연된 확장과 괄호 블록의 확장 시점도 다룹니다.
%~1로 Batch 인수의 따옴표 제거
%0부터 %9는 Batch 파일 이름과 전달된 인수입니다. 공백이 있는 경로를 하나의 인수로 전달하기 위해 따옴표로 감싸면, 물결표 수정자가 매개변수를 확장하면서 바깥쪽 따옴표를 제거합니다.
@echo off
set "input=%~1"
echo Input without surrounding quotes: [%input%]
remove-quotes.cmd "Report 2026.txt"
Input without surrounding quotes: [Report 2026.txt]
%~1은 Batch 인수에만 적용됩니다. 임의의 환경 변수에서 따옴표를 제거하는 문법이 아닙니다. 추가 인수에는 %~2와 %~3을 사용하며 내부에 들어 있는 따옴표는 제거하지 않습니다.
변수에서 모든 큰따옴표 제거
%variable:search=replacement% 형식은 변수 값의 문자열을 치환합니다. 빈 문자열로 큰따옴표를 치환하면 첫 번째와 마지막뿐 아니라 모든 큰따옴표가 사라집니다.
@echo off
set "value="Hello World""
set "withoutQuotes=%value:"=%"
echo Value: [%value%]
echo Without quotes: [%withoutQuotes%]
Value: ["Hello World"]
Without quotes: [Hello World]
내부 따옴표를 보존해야 한다면 이 방법을 사용하지 마십시오. 같은 치환 문법으로 단어도 바꿀 수 있습니다.
@echo off
set "value=Hello World"
set "updated=%value:World=Batch%"
echo [%updated%]
[Hello Batch]
&, |, <, >, ^가 포함된 값은 명령 구문과 섞이지 않도록 처리해야 합니다. 따옴표로 감싼 set은 일반적인 대입을 보호하지만 신뢰할 수 없는 문자열을 안전한 명령 코드로 만들지는 않습니다.
FOR /F로 바깥쪽 따옴표만 제거
내부 내용을 그대로 두고 바깥쪽 한 쌍만 제거하려면 FOR /F와 %~A를 사용합니다. Batch 파일에서는 반복 변수를 %%A, 대화형 프롬프트에서는 %A로 씁니다.
@echo off
set "value="Hello World""
for /f "delims=" %%A in (%value%) do set "withoutOuter=%%~A"
echo Original: [%value%]
echo Without outer quotes: [%withoutOuter%]
Original: ["Hello World"]
Without outer quotes: [Hello World]
delims=는 공백으로 줄을 여러 토큰으로 나누지 않게 합니다. 그래도 FOR /F에는 빈 줄, 구분자와 특수 문자에 대한 자체 파싱 규칙이 있습니다.
빈 값은 먼저 확인합니다.
@echo off
set "value="
set "withoutOuter="
if defined value for /f "delims=" %%A in (%value%) do set "withoutOuter=%%~A"
if not defined withoutOuter echo The value is empty
The value is empty
괄호 블록에서의 확장 시점
cmd는 명령 줄이나 괄호 블록을 파싱할 때 퍼센트 변수를 확장합니다. 블록 안에서 값을 바꾸어도 이후의 %value%가 이전 값을 참조할 수 있습니다. 지연된 확장은 시점을 바꾸지만 !가 포함된 데이터에는 별도의 제한을 만듭니다.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "value="Hello World""
set "withoutOuter="
for /f "delims=" %%A in (!value!) do set "withoutOuter=%%~A"
echo Without outer quotes: [!withoutOuter!]
endlocal
Without outer quotes: [Hello World]
필요할 때만 지연된 확장을 사용하십시오. 데이터의 느낌표가 변경될 수 있습니다.
따옴표 제거가 항상 올바른 해결책은 아닌 이유
따옴표는 공백이 있는 경로를 묶는 파서 구문일 수도 있고 값 자체의 일부일 수도 있습니다. 인수를 받는 경계에서 %~1로 정규화하면 이후 처리의 의미를 명확하게 유지할 수 있습니다.
@echo off
set "path=%~1"
if not defined path (
echo A path argument is required.
exit /b 1
)
echo Ready to process: [%path%]
Ready to process: [C:\Program Files\Tool]
따옴표를 제거해도 경로가 존재하는지 확인하거나 입력을 안전하게 만드는 것은 아닙니다. del, copy, move 등에 전달하기 전에 값을 검증하십시오.
방법 선택
값의 출처에 따라 인수에는 %~1, 모든 따옴표에는 %variable:"=%, 바깥쪽 한 쌍에는 FOR /F와 %~A를 선택합니다.
제한 사항과 문제 해결
인수에는 %~1, 모든 따옴표에는 %variable:"=%, 바깥쪽 한 쌍에는 FOR /F와 %~A를 사용합니다. 짝이 맞지 않는 따옴표는 잘못된 입력이며 모두 제거하면 문제를 숨길 수 있습니다. Batch 파일의 FOR 변수는 %%A, 프롬프트에서는 %A라는 차이도 기억하십시오. 입력의 실제 경계에 맞는 가장 좁은 방법을 선택하는 것이 안전합니다.