배치 파일의 변수에서 큰 따옴표를 제거하면 CMD 환경에 문제가 발생합니다.


116

아무도 배치 변수에서 따옴표를 제거하는 효과적이고 안전한 방법을 도울 수 있습니까?

매개 변수 % 1, % 2, % 3 등의 목록을 성공적으로 가져 와서 명명 된 변수에 배치하는 배치 파일을 작성했습니다. 이러한 매개 변수 중 일부는 여러 단어를 포함하므로 큰 따옴표로 묶여 있습니다.

> "Susie Jo" (%1)  
> "Smith Barnes" (%2)  
> "123 E. Main St." (%3)  

다음 % 변수는 명명 된 변수에 배치됩니다.

> set FirstName=%1  
> set LastName=%2  
> set ShipAddr=%3  

변수 검증은 에코에 의해 수행됩니다.

echo. % FirstName %
echo. % LastName %
echo. % ShipAddr %

결과 표시

"Susie Jo"  
"Smith Barnes"  
"123 E. Main St."  

선택한 변수에 포함 된 따옴표를 제거해야합니다. 예를 들어 FirstName 및 LastName은 다른 곳에서 사용되며 따옴표를 포함해서는 안됩니다.

테스트 배치 파일에서 변수에 ~ 물결 문자를 사용하여 따옴표를 제거하는 데 성공했습니다.

> set FirstName=%~1
> set LastName=%~2 

해결책이 있다고 생각했지만 곧 배치 파일을 실행할 때 비정상적인 동작을 경험했습니다. 갑자기 CMD가 긴 경로 설명을 인식하지 못합니다. 전체 경로에서 배치 파일의 정상적인 실행

> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat

보고

> 'C:\Documents' is not recognized as an internal or external command....

따라서 들어오는 % 1 % 2 ... % n 변수에 ~ 틸드 문자를 추가하면 약간의 변경이 발생한 것으로 보입니다. 일부 환경 변수가 변경되었을 수 있습니까?

또한 FOR 명령을 사용하여 다양한 시도로 변수 내에서 따옴표를 지우려고 시도했습니다. 그것은 어색해 보이며 작업을 수행하기 위해 변수 목록을 작성하여이를 수행하는 방법을 배울 수 없었습니다.

이 같은:

for %%g in (%FirstName% %LastName%) do (
set %%g=%%~g
set %%h=%%~h
set FirstName=%%~g
set LastName=%%h
echo.%FirstName% %LastName%
)

두 가지 문제가 있다고 생각합니다.

1) 들어오는 % 1 % 2 변수 (% ~ 1 등)에 ~ tilde를 삽입하는 '짧고 달콤한'아이디어는 일부 설정에 영향을 미치고 CMD가 긴 경로 이름을 탐색하는 방법을 변경 한 것 같습니다.

2) 선택된 명명 된 변수에서 따옴표를 제거하는 깨끗하고 쉬운 방법을 여전히 찾고 있습니다.

경험이 많은 분들께 도움을 주시면 감사하겠습니다. 여기에서 내 기술이 끝났습니다 ... 지침이 필요합니다!

편집 12/26/2009 13:36 PST 전체 배치 파일 :

Blockquote
:: dataout.bat
:: 개정 12/25/2009 포함 된 "따옴표를 제거하기 위해 들어오는 % 변수에 ~ tilde를 추가합니다.
:: 명령 줄 매개 변수를 사용하여 주소 목록을 작성 합니다. ::
QBooks IIF 가져 오기에 대한 데이터 출력 목록을
작성합니다. :: 작성 RUI의 판매자 주문 데이터
:: 테스트를위한 샘플 명령 줄 문자열
:: listmail [firstname] [lastname] [ "address string"] [ "city string"] [state] [zip] [Order #] [PurchDate] [Regname] [ "FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Invoice #]
:: 예 : dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver"WA 98664 1004968 05/25/2009 "Bellewinkle Moose" "Olive Oyl"101738 "On Account"20.67 FK-1P 1 8.95 3.00 1.39 239
@echo off
cls
c :
cd \
cd 문서 및 설정 \ 관리자 \ 내 문서 \ txt \ batchtest
에코 처리 % 1 % 2
: VARISET
::% n 명령 줄 매개 변수를 문자열 변수
세트 로 변환 ($ FirstName) = % ~ 1
세트 ($ LastName) = % ~ 2
세트 ($ BillingAddress1) = % ~ 3
세트 ($ BillingCity) = % ~ 4
세트 ($ BillingState) = % ~ 5
세트 ($ BillingPostal) = % ~ 6
세트 ($ OrderNumber) = % ~ 7
세트 ($ Purch_Date) = % ~ 8
세트 ($ RegistrationName) = % ~ 9
시프트
세트 ($ TransactionID) = % ~ 9
시프트
세트 ($ PaymentMethod) = % ~ 9
시프트
세트 ($ Total) = % ~ 9
시프트 세트 ($ ProductIdentifier) ​​= % ~ 9
시프트
세트 ($ Quantity) = % ~ 9
시프트
세트 ($ Price_Each) = % ~ 9
시프트
세트 ($ Pack_Prep) = % ~ 9
시프트
세트 ($ Shipping) = % ~ 9
시프트
세트 ($ ServiceFee) = % ~ 9
시프트
세트 ($ Discount) = % ~ 9
시프트
세트 ($ Invoice) = % ~ 9
시프트
세트 ($ UnitPrice) = % ~ 9
세트 _ShipCombName = % ($ FirstName) % % ($ LastName) %
echo ship combo name is % _ShipCombName %
pause
:: 로그 파일에 문자열 변수 쓰기
echo FN % ($ FirstName) % LN % ($ LastName) % BA % ($ BillingAddress1) % % ($ BillingCity) % % ($ BillingState) % % ($ BillingPostal) % % ($ OrderNumber) % % ($ Purch_Date) % % ($ RegistrationName) % % ($ TransactionID) % % ($ PaymentMethod) % % ($ Total) % % ($ ProductIdentifier) ​​% % ($ Quantity) % % ($ Price_Each) % % ($ Pack_Prep) % % ($ Shipping) % % ($ ServiceFee) % % ($ Discount) % % ($ Invoice) % % ($ UnitPrice) % % _ShipCombName % >> d_out_log.txt
:: 계정 할당 서비스 제공 업체
IF / i % ($ PaymentMethod) % == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009에서 다 기능성을위한 두 번째 Amazon pm't 방법 추가
IF / i % ($ PaymentMethod) % == Amazon SET _QBAcct = Amazon.com
IF / i % ($ PaymentMethod) % == MAST SET _QBAcct = Auth / Net
IF / i % ($ PaymentMethod) % == MasterCard SET _QBAcct = Auth / Net
IF / i % ($ PaymentMethod) % == Visa SET _QBAcct = Auth / Net
IF / i % ($ PaymentMethod) % == PayPal SET _QBAcct = PayPalPmts
IF / i % ($ PaymentMethod) % == 계정 SET _QBAcct = % ($ RegistrationName) %
IF / i % ($ PaymentMethod) % == 메일 SET _QBAcct = % ($ RegistrationName) %
IF / i % ( $ PaymentMethod) % == AMER SET _QBAcct = Auth / Net
IF / i % ($ PaymentMethod) % == DISC SET _QBAcct = Auth / Net
:: QBAccount
IF / i % ($ PaymentMethod) % ==에 따라 담당자 지정자를 할당합니다. Amazon Receivables SET _Rep = Amazon
:: 12-25-2009에서 다 기능성을위한 두 번째 Amazon pm't 방법 추가
IF / i % ($ PaymentMethod) % == Amazon SET _Rep = Amazon
IF / i % ($ PaymentMethod) % == MAST SET _Rep = BlueZap
IF / i % ($ PaymentMethod) % == MasterCard SET _Rep = BlueZap
IF / i % ($ PaymentMethod) % == Visa SET _Rep = BlueZap
IF / i % ($ PaymentMethod) % == PayPal SET _Rep = BlueZap
IF / i % ($ PaymentMethod) % == 계정 SET _Rep = RB
IF / i % ($ PaymentMethod) % == Mail SET _Rep = RB
IF / i % ($ PaymentMethod) % == AMER SET _Rep = BlueZap
IF / i % ($ PaymentMethod) % == DISC SET _Rep = BlueZap
:: 중복 주소 데이터 확인
findstr / i / s "% _ShipCombName %"addrlist.txt
echo errorlevel : % errorlevel %
if errorlevel 1 goto : ADDRWRITE
if errorlevel 0 goto : 주소
: ADDRWRITE
echo % _ShipCombName % >> addrlist.txt
echo % ($ BillingAddress1) % >> addrlist.txt
echo % ($ BillingCity) % % ($ BillingState) % % ($ BillingPostal) % >> addrlist.txt
echo. >> addrlist.txt
echo Address File Written
: ADDRFOUND
echo selected rep is % _Rep %
echo selected account is : % _QBAcct %
pause
:: RUI OUT
:: write Merchant Order ID & RUI Order ID to RUI
:: 중복 RUI 데이터 확인 writeRUI.txt
cd ..
cd RegKOut
find / i "% ($ OrderNumber) %"writeRUI.txt
echo errorlevel : % errorlevel %
if errorlevel 1 goto : RUIWRITE
if errorlevel 0 goto : IIFWRITE
: RUIWRITE
echo % ($ Invoice) % % ($ OrderNumber) % >> writeRUI.txt
:: 쓰기 RUI 종료
:: IIF OUT
: IIFWRITE
:: writeIIF.txt 에서 중복 송장 데이터 확인
find / i "% ($ OrderNumber) %"writeIIF.txt
echo errorlevel : % errorlevel %
if errorlevel 1 goto : HEADWRITE
if errorlevel 0 goto : LINEWRITE
: HEADWRITE
:: write 헤더, 배송 / 취급, 할인, 담당자 및 수수료 데이터를 QB IIF 가져 오기 파일로
에코 % ($ OrderNumber) % % ($ Purch_Date) % 송장 % ($ TransactionID) % % _QBAcct % 미수금 % ($ Total) % % _Rep % >> writeIIF.txt
echo H / P % ($ Pack_Prep) % 1? >> writeIIF.txt
echo SHP % ($ Shipping) % 1? >> writeIIF.txt
echo DISC % ($ Discount) % 1? >> writeIIF.txt
echo Comm % ($ ServiceFee) % 1? >> writeIIF.txt
: LINEWRITE
IF / i % ($ ProductIdentifier) ​​% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
echo % ($ ProductIdentifier) ​​%
: WRITE_DISC
:: 맞춤 변수에서 파싱 된 할인 가격을 기록합니다 :
echo % ($ ProductIdentifier) % % ($ Price_Each) % % ($ Quantity) %? >> writeIIF.txt
goto : EOF
: WRITE_DEFA
: 제품 데이터에서 파싱 된 기본 가격을 기록합니다.
echo % ($ ProductIdentifier) ​​% % ($ UnitPrice) % % ($ Quantity) %? >> writeIIF.txt
goto : EOF
:: 3 초 지연
:: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF


이를 위해 PowerShell을 사용할 수 있습니까? PowerShell을 사용하면 좀 더 제어 할 수있을 것 같습니다.
Robert Harvey

1
배치 파일을 확인했습니다. 잘 작동하는 것 같습니다 ( "shift set ($ ProductIdentifier) ​​= % ~ 9"줄을 수정 한 후 여기에 복사 및 붙여 넣기의 결과물이라고 생각합니다).
atzz 2009

Robert Harvey에게 감사합니다. 나는 PowerShell을 주시하고 있습니다. 프로그래밍 경험이 많지 않습니다. 학습 곡선이 어떤 것인지 잘 모르겠습니다. 배치 파일에 대한 경험이 있습니다. 주된 이유는 이것을 선택했습니다. 더 빨리 실행되도록 일괄 처리를 컴파일하려고합니다. 응답 해 주셔서 감사합니다.
BobB

감사합니다 atzz : 이후이 배치 파일을 좀 더 테스트했으며 ~ tilde 및 banishing 따옴표가 긴 경로 이름이있는 CMD 문제와 관련이 없다고 합리적으로 확신합니다. 긴 경로 이름을 제거하기 위해 루트에 가까운 짧은 이름의 하위 디렉토리를 설정하여이 문제를 해결했습니다.
BobB

전체 배치 파일을 표시 할 필요가 없습니다. 질문을 줄여주세요.
jor

답변:


192

끝에 큰 따옴표가 추가되어 문자열 끝에 다시 추가됩니다 (문자열에서 두 따옴표를 모두 제거한 후).

입력:

set widget="a very useful item"
set widget
set widget=%widget:"=%
set widget

산출:

widget="a very useful item"
widget=a very useful item

참고 : 큰 따옴표 "를 작은 따옴표 '로 바꾸려면 다음을 수행하십시오.

set widget=%widget:"='%

참고 : 단어 "World"(대소 문자 구분 안 함)를 BobB로 바꾸려면 다음을 수행하십시오.

set widget="Hello World!"
set widget=%widget:world=BobB%
set widget

산출:

widget="Hello BobB!"

초기 질문이 진행되는 한 (다음 코드를 배치 파일 .cmd 또는 .bat에 저장하고 실행하십시오) :

@ECHO OFF
ECHO %0
SET BathFileAndPath=%~0
ECHO %BathFileAndPath%
ECHO "%BathFileAndPath%"
ECHO %~0
ECHO %0
PAUSE

산출:

"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd
"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd
"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"
Press any key to continue . . .

%0스크립트 이름 및 경로입니다.
%1첫 번째 명령 줄 인수입니다.


감사합니다. 이것이 SET BathFileAndPath=%~0제가 SET BathFileAndPath=%~1
추구

%widget:"=%따옴표를 제거 하는 이유를 설명해 주 시겠습니까?
CodyBugstein 2014 년

4
@Imray- :old=new변수 확장에서 패턴 일치 및 대체입니다. 를 "으로 old하고 아무것도 new이면 따옴표가 균형이 맞지 않더라도 중간에 있더라도 제거됩니다.
Jesse Chisholm

set widget = % widget : "= % 위젯이 비어있을 때 이상한 동작이 발생하고"= "
Rahul Misra

43

귀하의 결론 (1)이 잘못된 것 같습니다. 다른 요인이 있어야합니다.

배치 파일 매개 변수의 따옴표 문제는 일반적으로 따옴표를 제거한 %~다음 적절한 위치에 수동으로 되 돌리면 해결됩니다 .

예 :

set cmd=%~1
set params=%~2 %~3

"%cmd%" %params%

주위의 따옴표에 유의하십시오 %cmd%. 그것들이 없으면 공백이있는 경로가 작동하지 않습니다.

전체 배치 코드를 게시 할 수 있다면 더 구체적인 답변을 할 수 있습니다.


1
동의한다; 나에게 var = % ~ 1 설정이 잘 작동하는 것 같습니다. 요청에 따라 전체 배치 파일을 게시하겠습니다.
BobB 2009

MS 참조 : 배치 매개 변수 사용 . 이렇게 많은 수정자가 있다는 것을 누가 알았습니까? 참고로 공식 MS 문서는 %~1asExpands %1 and removes any surrounding quotation marks ("").
cod3monk3y

@ cod3monk3y 또한 cmd이러한 수정 자에 대해 스스로 물어볼 수도 있습니다 : call /?매개 변수 수정 자에 대한 도움말, set /?변수 수정 자 (아마도 직관적이지 않음). 아주 편리합니다.
atzz 2014 년

12

나는 보통 다음과 같이 내 변수에서 모든 따옴표를 제거합니다.

set var=%var:"=%

그런 다음 필요할 때마다 다시 적용하십시오.

echo "%var%"

또한, 처음에는이에 문제가 있었다 나는보고 있었다에서 온 :A와를 .- 차질없이 일을하는 아웃, 계산 후. 좋은 팁!
DaveU 2014

9

간단한 방법으로이 작업을 수행하는 데 많은 시간을 보냈습니다. FOR 루프를주의 깊게 살펴본 후 한 줄의 코드로이 작업을 수행 할 수 있다는 것을 깨달았습니다.

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I

예:

@ECHO OFF
SET Quoted="Test string"

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I

ECHO %Quoted%
ECHO %Unquoted%

산출:

"Test string"
Test string

이 메서드는 "SET Quoted = Test string"과는 관련이 없습니다. 다음 질문은 다르다 "(큰 따옴표)의 존재 여부하는 방법은 해당 수도에가, 고급에 감사합니다..
Rhak Kahr

3

이것은 당신이 있으면 안되는 곳에서 % ~를 사용하고있는 간단한 버그처럼 들립니다. % ~가 배치 파일의 작동 방식을 근본적으로 변경하지 않는 경우 사용하면 해당 단일 상황에서 문자열에서 따옴표를 제거 할뿐입니다.


3

XP 이상을 사용 하는 경우이 링크 에서 배웠습니다 .

SET params = %~1

여기에 Windows 7에서 작동하는 다른 솔루션을 얻을 수 없습니다.

반복하기 위해 다음과 같이했습니다.

FOR %%A IN (%params%) DO (    
   ECHO %%A    
)

참고 : 일반적으로 공백으로 구분 된 인수를 전달하는 경우에만 큰 따옴표가 표시됩니다.


0
  1. set widget = "매우 유용한 항목"
  2. 위젯 설정
  3. widget = "매우 유용한 항목"
  4. set widget = % widget : "= %"
  5. 위젯 설정
  6. set widget = 매우 유용한 항목 "

"4 행 의 후행 따옴표 "는 문자열에 따옴표 를 추가 합니다. 제거해야합니다. 4 행의 구문은 다음으로 끝납니다.%


@ user195488-3 행 을 표시widget="a very useful item" 한대로 읽고 6 행 을 표시widget=a very useful item" 한대로 읽으십시오 . 7 행 이 표시set widget=%widget:"=% 되고 8 행은 표시된 행에 widget=a very useful item더 이상 후행 따옴표가 없음을 관찰합니다 .
Jesse Chisholm

0

해결책이 있다고 생각했지만 곧 배치 파일 실행시 비정상적인 동작을 경험했습니다. 갑자기 CMD가 긴 경로 설명을 인식하지 못합니다. 전체 경로에서 배치 파일의 정상적인 실행

C : \ Documents and Settings \ Administrator \ My Documents \ Txt \ batchtest \ dataout.bat

보고

'C : \ Documents'는 내부 또는 외부 명령으로 인식되지 않습니다 ....

당신의 모든 문제가 있습니다. CMD는 명령 줄에서 파일 이름 내부의 공백을 이해하지 못하므로 통과하려고한다고 생각합니다.

및 Settings \ Administrator \ My Documents \ Txt \ batchtest \ dataout.bat

매개 변수로

"C : \ Documents"

프로그램.

경로에 공백이있는 배치 파일을 실행하려면 인용해야합니다.

> "C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat"

효과가 있었을 것입니다.


0
@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

원래 매개 변수에 따옴표가 있는지 여부에 관계없이 따옴표가 있거나없는 것을 보여줍니다.

따옴표로 묶일 수도 있고 아닐 수도있는 매개 변수의 존재를 테스트하려면 위의 에코 앞에 다음 줄을 넣으십시오.

'% 1'== ''이면 yoursub로 이동

그러나 따옴표가 있거나 없을 수있는 파일의 존재를 확인하면 다음과 같습니다.

"! 1!"이 있으면 다른 하위로 이동

작은 따옴표와 큰 따옴표의 사용은 다릅니다.


0

모든 답변이 완료되었습니다. 하지만 한 가지 추가하고 싶었습니다.

FirstName = % ~ 1 설정

LastName = % ~ 2 설정

이 라인은 효과가 있었어야했고 약간의 변화가 필요했습니다.

"이름 = % ~ 1"설정

"LastName = % ~ 2"설정

따옴표 안에 전체 할당을 포함하십시오. 문제없이 따옴표를 제거합니다. 이것은 인수의 따옴표로 원치 않는 문제를 해결하는 선호되는 할당 방법입니다.


0

간단한 물결표 구문은 배치 파일에 전달되는 명령 줄 매개 변수 주위의 따옴표를 제거하는 경우에만 작동합니다.

SET xyz=%~1

위의 배치 파일 코드는 선행 및 후행 따옴표 (있는 경우)를 제거하는 첫 번째 매개 변수로 전달되는 값으로 xyz를 설정합니다.

그러나이 간단한 물결표 구문은 매개 변수로 전달되지 않은 다른 변수에는 작동하지 않습니다.

다른 모든 변수의 경우 제거 할 선행 및 후행 문자를 지정해야하는 확장 된 대체 구문을 사용해야합니다. 실제로 우리는 그것이 실제로 무엇인지 보지 않고 첫 번째와 마지막 문자를 제거하도록 지시하고 있습니다.

@SET SomeFileName="Some Quoted file name"
@echo %SomeFileName% %SomeFileName:~1,-1%

제거하기 전에 첫 번째와 마지막 문자가 실제로 인용 된 것이 무엇인지 확인하려면 다음과 같은 추가 코드가 필요합니다.

@SET VAR="Some Very Long Quoted String"
If aa%VAR:~0,1%%VAR:~-1%aa == aa""aa SET UNQUOTEDVAR=%VAR:~1,-1%
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.