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

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

매개 변수 % 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



답변

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

입력:

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첫 번째 명령 줄 인수입니다.


답변

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

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

예 :

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

"%cmd%" %params%

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

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


답변

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

set var=%var:"=%

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

echo "%var%"


답변

간단한 방법으로이 작업을 수행하는 데 많은 시간을 보냈습니다. 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


답변

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


답변

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

SET params = %~1

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

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

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

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


답변

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

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