กำหนดค่าของตัวแปรด้วยผลลัพธ์ของคำสั่งในไฟล์แบตช์ Windows


99

เมื่อทำงานในสภาพแวดล้อมBashเพื่อตั้งค่าของตัวแปรอันเป็นผลมาจากคำสั่งฉันมักจะทำ:

var=$(command -args)

ที่เป็นชุดตัวแปรโดยคำสั่งvar command -argsจากนั้นฉันสามารถเข้าถึงตัวแปรนั้นเป็น$varไฟล์.

วิธีที่ธรรมดากว่าในการทำสิ่งนี้ซึ่งเข้ากันได้กับ Unix shell เกือบทุกชนิดคือ:

set var=`command -args`

ที่กล่าวว่าฉันจะตั้งค่าของตัวแปรด้วยผลลัพธ์ของคำสั่งในไฟล์แบตช์ Windows ได้อย่างไร ฉันได้ลองแล้ว:

set var=command -args

แต่ฉันพบว่าvarถูกตั้งค่าcommand -argsเป็นมากกว่าผลลัพธ์ของคำสั่ง

คำตอบ:


63

ในการทำสิ่งที่เจสซี่อธิบายจากไฟล์แบตช์ของ Windows คุณจะต้องเขียน:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

แต่ฉันขอแนะนำให้ใช้Cygwinในระบบ Windows ของคุณแทนหากคุณคุ้นเคยกับการเขียนสคริปต์ประเภท Unix


19
ใช้for /f "delims=" %a in ('ver') do @set foobar=%aพร้อมรับคำสั่ง ใช้for /f "delims=" %%a in ('ver') do @set foobar=%%aในไฟล์สคริปต์
georg

ทางเลือกที่มีน้ำหนักเบาคือ Gnu บน Windows ( github.com/bmatzelle/gow/wiki ) bashเพียงแค่คำสั่งเปิดการทำงานที่รวดเร็วและ จากนั้นคุณสามารถเขียนคำสั่ง bash คุณยังสามารถเรียกใช้สคริปต์ทุบตี
Nathan

4
โปรดทราบว่าหากคำสั่งของคุณมีไพพ์คุณจะต้องหลีกเลี่ยงด้วยเครื่องหมายคาเร็ตตัวอย่างเช่น for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ set foobar = %% a
yoyo

35

ต้องระวังบ้างเนื่องจากคำสั่งแบตช์ของ Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

ไม่มีความหมายเดียวกันกับคำสั่ง Unix shell:

theValue=`command`

พิจารณากรณีที่คำสั่งล้มเหลวทำให้เกิดข้อผิดพลาด

ในเวอร์ชัน Unix เชลล์การกำหนดให้กับ "theValue" ยังคงเกิดขึ้นค่าก่อนหน้านี้จะถูกแทนที่ด้วยค่าว่าง

ในเวอร์ชันแบตช์ของ Windows เป็นคำสั่ง "for" ที่จัดการกับข้อผิดพลาดและจะไม่มีการเข้าถึงส่วนคำสั่ง "do" ดังนั้นค่าก่อนหน้าของ "theValue" จะยังคงอยู่

หากต้องการรับความหมายเหมือน Unix เพิ่มเติมในสคริปต์แบตช์ของ Windows คุณต้องแน่ใจว่ามีการกำหนด:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

การไม่ล้างค่าของตัวแปรเมื่อแปลงสคริปต์ Unix เป็นชุด Windows อาจเป็นสาเหตุของข้อผิดพลาดเล็กน้อย


2
ขอบคุณที่อธิบายความแตกต่างเล็กน้อยระหว่าง Windows และ * nix
Jeroen Wiert Pluimers

3
อย่าลืมหลีกเลี่ยงอักขระพิเศษใด ๆ ในcommand; เช่น: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart

@Bill_Stewart คุณเพิ่งบันทึกวันของฉันสักครู่ฉันคิดว่ามันยากกว่ามากที่จะกำหนดผลลัพธ์ของคำสั่ง
piped

20

นี่คือวิธีที่ฉันต้องทำเมื่อต้องการผลลัพธ์ของแบบสอบถามฐานข้อมูลในไฟล์แบตช์ของฉัน

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

คีย์อยู่ในบรรทัดที่ 2: "set / p" กำหนดค่าของ "ผลลัพธ์" เป็นค่าของบรรทัดแรก (เท่านั้น) ใน "__query.tmp" ผ่านตัวดำเนินการเปลี่ยนเส้นทาง "<"


16

วิธีเดียวที่ฉันเคยเห็นคือถ้าคุณทำสิ่งนี้:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver เป็นคำสั่งเวอร์ชันสำหรับ Windows และในระบบของฉันมันสร้าง:

Microsoft Windows [Version 6.0.6001]

ที่มา


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