แบทช์ที่เทียบเท่ากับแบ็คไทม์ Bash


97

เมื่อทำงานกับ Bash ฉันสามารถใส่ผลลัพธ์ของคำสั่งหนึ่งในคำสั่งอื่นได้ดังนี้:

my_command `echo Test`

ก็จะเหมือนกับ

my_command Test

(เห็นได้ชัดว่านี่เป็นเพียงตัวอย่างที่ไม่สามารถใช้ได้จริง)

ฉันแค่สงสัยว่าคุณสามารถทำสิ่งเดียวกันใน Batch ได้หรือไม่


คำตอบ:


53

คุณสามารถทำได้โดยเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ก่อน ตัวอย่างเช่น:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
คุณต้องค้นหาสถานที่ที่คุณมีสิทธิ์ในการเขียนเพื่อจัดเก็บไฟล์ชั่วคราว คุณต้องทำความสะอาดหลังจากตัวเอง ตัวอย่างนี้ช่วยให้คุณอ่านอินพุตบรรทัดแรกเท่านั้น สำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมดfor /fตัวแปรนั้นดีกว่ามาก
โจอี้

@grawity - พร้อมด้วย%random%
bacar

1
@joey มันอ่านแต่ละบรรทัด แต่จะเชื่อมต่อกับอาร์กิวเมนต์บรรทัดคำสั่งในคำสั่งเดียวได้อย่างไร
user877329

มันจัดการกับการขึ้นบรรทัดใหม่อย่างไร?
andrewrk

104

คุณสามารถรับฟังก์ชันที่คล้ายกันได้โดยใช้สคริปต์ cmd.exe กับไฟล์ for /fคำสั่ง:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

ใช่มันค่อนข้างไม่ชัดเจน (พูดน้อยที่สุด) แต่มันมีอะไรอยู่

ดู for /?รายละเอียดเกี่ยวกับเลือด

Sidenote: ฉันคิดว่าการใช้ " echo" ใน backticks ในfor /fคำสั่ง "" จะต้องทำโดยใช้ " cmd.exe /c echo Test" เพราะechoเป็นคำสั่งภายในสำหรับcmd.exeแต่มันทำงานในลักษณะที่เป็นธรรมชาติมากขึ้น สคริปต์แบตช์ของ Windows ทำให้ฉันประหลาดใจเสมอ (แต่โดยปกติแล้วไม่ใช่ในทางที่ดี)


2
โดยปกติคุณจะต้องทำสิ่งนี้เมื่อเรียกใช้งานเชลล์ที่สร้างขึ้นจากโปรแกรมภายนอกที่ไม่สร้างเชลล์โดยอัตโนมัติ เช่น C system()นั้นใช้ได้ดี iirc เนื่องจากมันเริ่มเชลล์ไม่ว่าในกรณีใด ๆ แต่. NET Process.Startจำเป็นต้องเรียกใช้เชลล์อย่างชัดเจน อะไรทำนองนั้น iirc ไม่ว่าในกรณีใดฉันคิดว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับ :-)
โจอี้

2
ตัวเลือกที่forจะไม่ทำร้าย แต่ทำให้ปัญหาสับสน อะไรประมาณนี้:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas

9
ใช้% เดียวแทน %% เมื่อดำเนินการเหมือนกันบนบรรทัดคำสั่งแทนที่จะใช้ในสคริปต์แบตช์
ขวดโหล

2
ดูเหมือนจะใช้งานได้ไม่ดีกับท่อตัวอย่างเช่นตัวดำเนินการ ">" แต่อย่างอื่นนี่สุดยอดมาก เว้นแต่ว่านี่เป็นเพียงปัญหา% vs %% ที่ฉันมี
Jonathan

3
@ อีวาน: tokens=*เป็นสิ่งสำคัญ มิฉะนั้นหากผลลัพธ์ของคำสั่งมีช่องว่างระบบจะแสดงเฉพาะคำแรกเท่านั้น เรียกใช้สิ่งนี้ที่พรอมต์: for /f %a in ('"echo foo bar"') do echo "%a". "foo"มันจะพิมพ์
Dan Dascalescu

29

อ่านเอกสารสำหรับคำสั่ง "for": for /?

น่าเศร้าที่ฉันไม่ได้ลงชื่อเข้าใช้ Windows เพื่อตรวจสอบด้วยตัวเอง แต่ฉันคิดว่าสิ่งนี้สามารถประมาณสิ่งที่คุณต้องการ:

for /F %i in ('echo Test') do my_command %i

6
ในกรณีที่มีผู้อื่นสะดุดกับสิ่งนี้เมื่อคำสั่งถูกเรียกใช้งานจากไฟล์แบตช์ (* .bat) ตัวแปร% i ทั้งสองจะต้องเป็นเครื่องหมายเปอร์เซ็นต์สองเท่า: %% i
mgouin

3

คุณสามารถเรียกใช้Bashใน Windows ได้ตลอดเวลา ฉันทำมันตลอดเวลาด้วยMSYS (มีประสิทธิภาพมากกว่าCygwinมาก)


น่าเสียดายที่ MSYS แทบจะไม่ได้รับการบำรุงรักษาในขณะนี้เพื่อให้ได้ bash ที่ทันสมัยคุณต้องติดตั้งแยกต่างหาก
Ed Randall

1
BusyBox มีขนาดเล็กลง (~ 432KB) ไม่ใช่ Bash เต็มรูปแบบ แต่เพียง Ash รับพอร์ต Windows อย่างไม่เป็นทางการที่นี่: frippery.org/busybox
Martin

3

บางทีฉันอาจจะคาดคั้นไวยากรณ์ของfor /fวิธีการมาตรฐานแต่เมื่อฉันใส่คำสั่งที่ซับซ้อนมากที่เกี่ยวข้องกับ && และ | ภายใน backticks ในขีด จำกัดfor /fมันทำให้เกิดปัญหา การปรับเปลี่ยนเล็กน้อยจากปกติสามารถจัดการกับคำสั่งที่ซับซ้อนได้โดยพลการ:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

ด้วยการใส่คำสั่งเต็มและซับซ้อนของคุณในตัวแปรก่อนจากนั้นจึงใส่การอ้างอิงไปยังตัวแปรในขีด จำกัด แทนที่จะใส่คำสั่งที่ซับซ้อนลงในขีด จำกัด ของ for loop โดยตรงคุณสามารถหลีกเลี่ยงปัญหาการตีความไวยากรณ์ได้ ขณะนี้หากฉันคัดลอกคำสั่งที่แน่นอนที่ฉันตั้งค่าให้VVตัวแปรในตัวอย่างด้านบนไปยังตำแหน่งที่ใช้%VV%จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์


1
สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่ฉันพบว่าคุณสามารถทำไพพ์ได้โดยตรงภายในคำสั่ง for ถ้าคุณหนีด้วยกะรัต (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) do command %% a
Heptite

@Heptite Card หนีไม่ได้ผลสำหรับฉัน แต่โดยรอบบรรทัดคำสั่งที่มีเครื่องหมายคำพูดคู่ทำ
Alexandr Zarubkin

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