การลบเครื่องหมายคำพูดคู่ออกจากตัวแปรในไฟล์แบตช์จะสร้างปัญหากับสภาพแวดล้อม CMD


117

ใครสามารถช่วยด้วยวิธีการลบเครื่องหมายคำพูดที่มีประสิทธิภาพและปลอดภัยจากตัวแปรแบตช์ได้หรือไม่?

ฉันได้เขียนไฟล์แบตช์ซึ่งนำเข้ารายการพารามิเตอร์% 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 ถูกใช้ที่อื่นและต้องไม่มีเครื่องหมายคำพูด

ในไฟล์ชุดการทดสอบฉันประสบความสำเร็จในการกำจัดเครื่องหมายคำพูดโดยใช้อักขระ ~ tilde ในตัวแปร

> 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....

ดังนั้นดูเหมือนว่าการเพิ่มอักขระ ~ tilde ให้กับตัวแปร% 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 ฯลฯ ) ดูเหมือนจะส่งผลต่อการตั้งค่าบางอย่างและเปลี่ยนแปลงวิธีที่ CMD นำทางชื่อพา ธ แบบยาว

2) ฉันยังคงค้นหาวิธีที่ง่ายและสะอาดในการกำจัดเครื่องหมายคำพูดจากตัวแปรที่เลือก

ความช่วยเหลือใด ๆ สำหรับผู้ที่มีประสบการณ์มากกว่าจะได้รับการชื่นชมมากที่สุด ฉันอยู่ในจุดสิ้นสุดของทักษะที่นี่ ... ต้องการคำแนะนำโปรด!

แก้ไข 26/12/2552 13:36 PST ไฟล์แบตช์ทั้งหมด:

Blockquote
:: dataout.bat
:: revision 12/25/2009 เพิ่ม ~ tilde ให้กับตัวแปร% ขาเข้าเพื่อกำจัด "เครื่องหมายคำพูดที่ฝังอยู่
:: เขียนรายการที่อยู่โดยใช้พารามิเตอร์บรรทัดคำสั่ง
:: เขียนรายการเอาต์พุตข้อมูลสำหรับการนำเข้า QBooks IIF
:: เขียน ข้อมูลใบสั่งผู้ขายสำหรับ RUI
:: สตริงบรรทัดคำสั่งตัวอย่างสำหรับการทดสอบ
:: listmail [ชื่อแรก] [นามสกุล] ["สตริงที่อยู่"] ["สตริงเมือง"] [รัฐ] [zip] [คำสั่งซื้อ #] [PurchDate] [Regname] ["FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Invoice #]
:: example: 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 เอกสารและการตั้งค่า \ administrator \ my documents \ txt \ batchtest
echo processing% 1% 2
: VARISET
::แปลงพารามิเตอร์บรรทัดคำสั่ง% n เป็น
ชุด ตัวแปรสตริง ($ FirstName) =% ~ 1
ชุด ($ LastName) =% ~ 2
ชุด ($ BillingAddress1) =% ~ 3
ชุด ($ BillingCity) =% ~ 4
ชุด ($ BillingState) =% ~ 5
set ($ BillingPostal) =% ~ 6
set ($ OrderNumber) =% ~ 7
set ($ Purch_Date) =% ~ 8
set ($ RegistrationName) =% ~ 9
shift
set ($ TransactionID) =% ~ 9
shift
set ($ PaymentMethod) =% ~ 9
shift
set ($ Total) =% ~ 9
shift set ($ ProductIdentifier) ​​=% ~ 9
shift
set ($ Quantity) =% ~ 9
shift
set ($ Price_Each) =% ~ 9
shift
set ($ Pack_Prep) =% ~ 9
shift
set ($ Shipping) =% ~ 9
shift
set ($ ServiceFee) =% ~ 9
shift
set ($ Discount) =% ~ 9
shift
set ($ Invoice) =% ~ 9
shift
set ($ UnitPrice) =% ~ 9
set _ShipCombName =% ($ FirstName)%% ($ LastName)%
ชื่อคอมโบเรือ echo คือ% _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)%% (ส่วนลด $)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: กำหนดบัญชีโดย ผู้ให้บริการ
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009 เพิ่มวิธี Amazon pm ที่สองสำหรับความคล่องตัว
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)% == Mail SET _QBAcct =% ($ RegistrationName)%
IF / i% ( $ PaymentMethod)% == AMER SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth / Net
:: กำหนด Rep designator ตาม QBAccount
IF / i% ($ PaymentMethod)% == Amazon ลูกหนี้ 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: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% >> addrlist.txt
echo% ($ BillingAddress1)% >> addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >>
เสียงสะท้อนaddrlist.txt >> addrlist.txt
ไฟล์ที่อยู่ echo เขียน
: ADDRFOUND
echo ที่เลือกตัวแทนคือ% _Rep%
echo บัญชีที่เลือกคือ:% _QBAcct%
pause
:: RUI OUT
:: เขียน Merchant Order ID & RUI Order ID ไปยัง 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
echo% ($ OrderNumber)%% ($ Purch_Date)% ใบแจ้งหนี้% ($ TransactionID)%% _QBAcct% บัญชีลูกหนี้% ($ รวม)%% _Rep % >> writeIIF.txt
echo H / P% ($ Pack_Prep)% 1? >> writeIIF.txt
echo SHP% ($ Shipping)% 1? >> writeIIF.txt
echo DISC% (ส่วนลด $)% 1? >> writeIIF.txt
ก้อง Comm% ($ ServiceFee)% 1? >> writeIIF.txt
: LINEWRITE
IF / i% ($ ProductIdentifier)% equ PH-1 ไปที่ WRITE_DEFA ELSE ไปที่ 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-second delay
:: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF


คุณสามารถใช้ PowerShell เพื่อทำสิ่งนี้ได้หรือไม่ ฉันสงสัยว่าคุณจะควบคุมได้มากกว่านี้ถ้าคุณใช้ PowerShell
Robert Harvey

1
ฉันตรวจสอบไฟล์แบตช์ของคุณแล้วดูเหมือนว่าจะทำงานได้ดี (หลังจากที่ฉันแก้ไขบรรทัด "shift set ($ ProductIdentifier) ​​=% ~ 9" - ซึ่งฉันคิดว่าเป็นสิ่งประดิษฐ์ของการคัดลอกและวางที่นี่)
atzz

ขอบคุณ Robert Harvey; ฉันกำลังมองหา PowerShell ฉันไม่ค่อยมีประสบการณ์กับการเขียนโปรแกรม .. ไม่แน่ใจว่าการเรียนรู้จะเป็นอย่างไร ฉันมีประสบการณ์กับไฟล์แบตช์เหตุผลหลักที่ฉันเลือกสิ่งนี้ ฉันตั้งใจจะรวบรวมแบตช์เพื่อให้ทำงานได้เร็วขึ้น ขอบคุณสำหรับการตอบกลับ
BobB

ขอบคุณ atzz: ตั้งแต่นั้นมาฉันได้ทดสอบไฟล์แบตช์นี้มากขึ้นและฉันมั่นใจพอสมควรว่าเครื่องหมาย ~ tilde และการเนรเทศไม่เกี่ยวข้องกับปัญหา CMD ที่มีชื่อพา ธ ยาว ฉันแก้ไขสิ่งนั้นโดยการตั้งค่าไดเรกทอรีย่อยชื่อสั้นใกล้กับรูทเพื่อกำจัดชื่อพา ธ ยาว ๆ
BobB

ไม่จำเป็นต้องแสดงไฟล์แบตช์แบบเต็ม กรุณาตัดคำถามของคุณให้สั้นลง

คำตอบ:


193

คุณมีเครื่องหมายคำพูดคู่พิเศษในตอนท้ายซึ่งจะเพิ่มกลับไปที่ส่วนท้ายของสตริง (หลังจากลบเครื่องหมายคำพูดทั้งสองออกจากสตริง)

การป้อนข้อมูล:

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

เอาท์พุท:

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

หมายเหตุ: ในการแทนที่ Double Quotes "ด้วย Single Quotes ให้ทำดังนี้:

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(อันที่จริงอาร์เรย์พารามิเตอร์ของฉันเริ่มต้นด้วย 1 ดังนั้นฉันจึงใช้SET BathFileAndPath=%~1
Valamas

คุณช่วยอธิบาย%widget:"=%ได้ไหมว่าทำไมจึงต้องลบเครื่องหมายคำพูด?
CodyBugstein

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

MS อ้างอิง: ใช้พารามิเตอร์ชุด ใครจะรู้ว่ามีตัวดัดแปลงมากมาย? สำหรับการอ้างอิง MS doc อย่างเป็นทางการให้คำอธิบาย%~1ว่าExpands %1 and removes any surrounding quotation marks ("").
cod3monk3y

@ cod3monk3y นอกจากนี้ยังเป็นไปได้ที่จะถามcmdตัวเองเกี่ยวกับตัวปรับแต่งเหล่านี้: call /?เพื่อขอความช่วยเหลือเกี่ยวกับตัวปรับพารามิเตอร์set /?สำหรับตัวปรับแต่งตัวแปร (อาจจะไม่ค่อยเข้าใจง่ายนัก) ค่อนข้างสะดวก
atzz

12

ฉันมักจะลบคำพูดทั้งหมดออกจากตัวแปรของฉันด้วย:

set var=%var:"=%

จากนั้นนำไปใช้อีกครั้งทุกที่ที่ฉันต้องการเช่น:

echo "%var%"

ตอนแรกฉันมีปัญหากับเรื่องนี้เช่นกันปรากฎว่าฉันเห็น:ว่าเป็น.- หลังจากที่คิดออกแล้วก็ทำงานได้โดยไม่มีปัญหา เคล็ดลับดีๆ!
DaveU

9

ใช้เวลามากในการพยายามทำสิ่งนี้ด้วยวิธีง่ายๆ หลังจากดู FOR loop อย่างรอบคอบแล้วฉันก็รู้ว่าฉันสามารถทำได้ด้วยโค้ดเพียงบรรทัดเดียว:

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" คำถามต่อไปคือจะแตกต่างกันอย่างไร "(double quote) มีอยู่จริงหรือไม่สำหรับผู้ที่อาจเกี่ยวข้องขอบคุณล่วงหน้า
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. ตั้งค่า 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=

แสดงโดยมีหรือไม่มีเครื่องหมายคำพูดโดยไม่คำนึงว่าพารามิเตอร์ดั้งเดิมมีเครื่องหมายคำพูดหรือไม่

และถ้าคุณต้องการทดสอบการมีอยู่ของพารามิเตอร์ที่อาจมีหรือไม่มีอยู่ในเครื่องหมายคำพูดให้วางบรรทัดนี้ไว้หน้า echos ด้านบน:

ถ้า '% 1' == '' goto yoursub

แต่หากตรวจสอบการมีอยู่ของไฟล์ที่อาจมีหรือไม่มีเครื่องหมายคำพูดแสดงว่า:

ถ้ามี "! 1!" goto othersub

โปรดทราบว่าการใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่จะแตกต่างกัน


0

ทุกคำตอบมีครบถ้วน แต่อยากจะเพิ่มสิ่งหนึ่ง

ตั้ง FirstName =% ~ 1

ตั้ง LastName =% ~ 2

บรรทัดนี้ควรใช้งานได้คุณต้องมีการเปลี่ยนแปลงเล็กน้อย

ตั้งค่า "FirstName =% ~ 1"

ตั้งค่า "LastName =% ~ 2"

รวมการมอบหมายที่สมบูรณ์ไว้ในเครื่องหมายคำพูด มันจะลบคำพูดโดยไม่มีปัญหา นี่เป็นวิธีการกำหนดที่นิยมใช้ซึ่งแก้ไขปัญหาที่ไม่ต้องการเกี่ยวกับเครื่องหมายคำพูดในอาร์กิวเมนต์


0

ไวยากรณ์ tilde แบบง่ายใช้ได้เฉพาะกับการลบเครื่องหมายคำพูดรอบ ๆ พารามิเตอร์บรรทัดคำสั่งที่ส่งผ่านไปยังไฟล์แบตช์

SET xyz=%~1

โค้ดไฟล์แบตช์ด้านบนจะตั้งค่า xyz เป็นค่าใด ๆ ที่จะถูกส่งผ่านเนื่องจากพารามิเตอร์ตัวแรกจะตัดคำพูดที่นำหน้าและต่อท้ายออกไป (ถ้ามี)

แต่ไวยากรณ์ tilde แบบธรรมดานี้จะใช้ไม่ได้กับตัวแปรอื่น ๆ ที่ไม่ได้ส่งผ่านเป็นพารามิเตอร์

สำหรับตัวแปรอื่น ๆ ทั้งหมดคุณต้องใช้ไวยากรณ์การแทนที่แบบขยายที่กำหนดให้คุณต้องระบุอักขระนำหน้าและอักขระที่ล้าหลังเพื่อลบออก เรากำลังสั่งให้ถอดอักขระตัวแรกและตัวสุดท้ายออกอย่างมีประสิทธิภาพโดยไม่ดูว่ามันคืออะไร

@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.