วิธีแยกส่วนของสตริงในไฟล์แบตช์ของ Windows


30

สมมติว่าฉันมีค่าเช่น "Abc_123" ที่เก็บไว้ในตัวแปรในไฟล์ batch (cmd) ฉันต้องการที่จะจบลงด้วยตัวแปรที่มีเพียง "123" มีวิธีใดในตัวที่ทำเช่นนี้?

ฉันไม่จู้จี้จุกจิกเกี่ยวกับวิธีการหรือประสิทธิภาพตราบใดที่มันติดตั้งในระบบ Windows (Vista / 2008) ทั่วไป

คำตอบ:


40

ใช้ไวยากรณ์สตริงย่อย:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123

4
คุณสามารถดูไวยากรณ์แบบเต็มด้วยhelp setตามที่กล่าวถึงในวิธีที่ดีที่สุดในการทำซับสตริงในไฟล์แบตช์คืออะไร? บน StackOverflow
User5910

1
หากฉันต้องการให้ตัวแปร 4 และ 3 เป็นอินพุตตัวแปรฉันจะทำอย่างไร %string:~%start%,%len%%
MakPo

ไม่เป็นไร. ฉันพบคำตอบ ss64.com/nt/syntax-substring.html
MakPo

3
เพื่อสรุปลิงก์จาก @MakPo: ใช้CALL, likeCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny

8

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

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

โดยพื้นฐานแล้วสตริงของคุณจะถูกแบ่งออกเป็นโทเค็นโดยใช้เครื่องหมายขีดล่างเป็นตัวคั่น (delims = _) เฉพาะอันที่สอง (โทเค็น = 2) เท่านั้นที่จะผ่าน (เป็นตัวแปร %% a) ไปยังลูป for การวนซ้ำจะทำงานเพียงครั้งเดียวเนื่องจากคุณจัดการกับสตริงเดี่ยวในกรณีนี้

หากคุณต้องการบันทึกสิ่งต่าง ๆ ทั้งก่อนและหลังการขีดล่างให้ลอง:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

โปรดทราบว่า %% a เป็นตัวแปรสำหรับโทเค็นแรกของการแยก %% b เป็นตัวแปรสำหรับโทเค็นที่สองของการแยก


3

หากคุณพบว่าภาษาแบตช์ไม่ทรงพลังพอที่จะทำสิ่งที่คุณต้องการและเป็นไปได้ยากที่จะไปถึงจุดนั้น - คุณสามารถใช้Windows PowerShellได้ นี่ไม่ใช่การติดตั้งตามค่าเริ่มต้นใน Windows ทุกรุ่น แต่คุณสามารถดาวน์โหลดได้ฟรี

หากคุณไม่ชอบภาษา PowerShell ก็มี Perl คุณจะต้องติดตั้งในทุกระบบ มีคนอื่นด้วย


คำถามไม่ได้ถามเกี่ยวกับ Powershell หรือ Perl
Zimba

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
สิ่งนี้ทำอะไรเป็นพิเศษ?
Pimp Juice IT

โอ้ถ้าคุณถามว่ารหัสนี้ทำงานอย่างไร: มันจะลบทุกอย่างออกก่อนหมายเลขโดยมีเครื่องหมายขีดล่างนำหน้า
Zimba

@Zimba มีวิธีใดที่จะขยายให้เป็น "last _" ได้หรือไม่ ฉันสามารถหาเอกสารนี้ได้จากที่ไหน?
TWiStErRob

ตกลงพบเอกสารเพิ่มเพื่อตอบ คำถามยังคงอยู่: ฉันจะ*โลภได้อย่างไร ฉันใช้ ol ดี ' IF NOT ... GOTO :replaceแต่จะดีถ้ามีวิธีที่ดีกว่า
TWiStErRob

1
@TWiStErRob: ฉันเข้าใจ หากคุณไม่ทราบจำนวนที่_มีอยู่ให้ไปที่วงสุดท้ายแล้วset var
ซิมบ้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.