การกำหนดและใช้ตัวแปรในไฟล์แบตช์


450

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

@echo off

set location = "bob"
echo We're working with "%location%"

ผลลัพธ์ที่ฉันได้รับมีดังนี้:

We're working with ""

เกิดอะไรขึ้นที่นี่? ทำไมตัวแปรของฉันถึงไม่เป็นเสียงก้อง

คำตอบ:


552

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


7
หากพื้นที่ก่อนที่จะ=ถูกตีความว่าเป็นส่วนหนึ่งของชื่อแล้วตัวแปรไม่สามารถนำมาอ้างอิงเป็นก็จะต้องมีการอ้างอิงเป็น%location% %location %นั่นคือการพิมพ์ผิดหรือเปล่า?
ตัวแปรแปรปรวน

7
@ ตัวแปรที่ยอมรับได้: คุณพูดถูก; ดูเหมือนว่าคำตอบดั้งเดิมจะตกเป็นเหยื่อของการแก้ไขที่ไม่ถูกต้อง
Brian Nixon

18
นี่คือสิ่งที่ MS มาพร้อมกับ
Falaque

5
@Falaque ตรงข้ามกับalias x = y* ในที่ดินระวัง?
พื้นฐาน

1
@Falaque ดังนั้นสิ่งที่คุณคิดว่าทุบตีจะทำอย่างไรเมื่อทำงานx = y?
phuclv

263

ช่องว่างมีความสำคัญ คุณสร้างชื่อตัวแปรที่มีค่าของ'location ' หมายเหตุ - เพิ่มเครื่องหมายคำพูดเดี่ยวล้อมรอบเพื่อเพิ่มตำแหน่งของพื้นที่
' "bob"'

หากคุณต้องการคำพูดในค่าของคุณแล้วรหัสของคุณควรมีลักษณะ

set location="bob"

หากคุณไม่ต้องการคำพูดรหัสของคุณควรมีลักษณะดังนี้

set location=bob

หรือดีกว่าเลย

set "location=bob"

ไวยากรณ์สุดท้ายป้องกันช่องว่างต่อท้ายโดยไม่ตั้งใจจากการรับค่าและยังป้องกันอักขระพิเศษเช่น& |ฯลฯ


8
มีข้อเสียสำหรับไวยากรณ์ล่าสุดหรือไม่
Wolf

8
@ Wolf - ไม่ไม่มีข้อเสีย อย่างไรก็ตามมีข้อ จำกัด ว่าเมื่อใดจึงจะมีประสิทธิภาพมากที่สุด ตราบใดที่ค่าไม่ได้มีเครื่องหมายอัญประกาศแล้วตัวละครเกือบทุกตัวสามารถปรากฏในค่าได้โดยไม่ต้องกังวลกับการหลบหนี ข้อยกเว้นคือ%และอาจเป็นไปได้!หากเปิดใช้งานการขยายล่าช้า แต่ถ้าค่าที่จะมีคำพูดแล้วคุณจะต้องกังวลเกี่ยวกับเมื่อตัวหนีพิษเช่น|, &ฯลฯ
dbenham

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

1
@ Wolf คุณเพียงแค่ต้องแน่ใจว่าเปิดใช้งานส่วนขยายคำสั่งแล้ว แต่นี่เป็นการกำหนดค่าเริ่มต้นอยู่แล้ว ...
aschipfl

7

อินพุต location.bat

@echo off
cls

set /p "location"="bob"
echo We're working with %location%
pause

เอาท์พุต

We're working with bob

(คุณทำผิดพลาด: spaceและ" ")


4
set /pแจ้งให้ผู้ใช้และเก็บคำตอบในตัวแปรที่ระบุ เช่นset /p name="What is your name? " & echo Hello, %name%.
Robert Mooney

6
-1, ไวยากรณ์set /p "varname"="text"ผิด, มันจะสร้างตัวแปรที่ชื่อว่าlocation"(พร้อมด้วยเครื่องหมายคำพูดต่อท้าย!) set /p location="bob"มันควรจะเป็น แต่ถึงกระนั้นมันก็ไม่ตรงกับคำถามอีกต่อไปแล้ว
jeb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.