เปลี่ยนไดเร็กทอรีชั่วคราวสำหรับคำสั่งแบตช์ไฟล์เดียว


19

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

(cd temporary/new/directory ; command)
# now I am still in original directory

สามารถทำได้ใน Windows batch-files (หรือ cmd-files)

การทำเช่นเดียวกันในไฟล์ชุดทำให้ฉันอยู่ในไดเรกทอรีใหม่

ที่ฉันสามารถทำได้:

pushd temporary\new\directory && command && popd

แต่ popd commandจะขึ้นอยู่กับความสำเร็จของ

ความคิดใด ๆ


คุณเรียกใช้ "batch-file" หรือ "cmd-file" ของคุณอย่างไร? หากคุณใส่คำสั่ง cd ลงในเชลล์สคริปต์และดำเนินการสคริปต์นั้น (ไม่ใช่แหล่งที่มา) ไดเร็กทอรีการทำงานปัจจุบันของเชลล์การเรียกจะไม่เปลี่ยนแปลง
garyjohn

เพื่อให้ชัดเจนนี่คือการอ้างอิงถึงชุดไฟล์ windows
เกร็ก

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

เมื่อฉันเรียกคืนคุณอ้างถึงเชลล์สคริปท์และไม่ได้พูดถึง Windows ในคำถามดั้งเดิมของคุณดังนั้นฉันจึงสันนิษฐานว่าคุณกำลังใช้ระบบที่คล้าย Unix อย่างไม่ถูกต้อง ตอนนี้ฉันเข้าใจ.
garyjohn

ใช่ขอโทษฉันรู้ฉันก็ไม่ชัดเจน (แม้ว่าฉันคิดว่า 'แบทช์ไฟล์' เป็นคำใบ้ :-P)
เกร็ก

คำตอบ:


21

ถ้าคุณทำ:

pushd \windows && foobar && popd

คุณจะถูกทิ้งไว้ (ตามที่คุณระบุ) ในโฟลเดอร์ \ windows ลอง:

pushd \windows & foobar & popd

และคุณควรกลับไปที่ที่คุณเริ่มต้น


1
อา, เครื่องหมายแอมเปอร์แซนด์เดียวมีค่าเท่ากับเซมิโคลอนใน sh มันสมบูรณ์แบบ (และการอ้างอิง: ss64.com/nt/syntax-conditional.html )
Greg

6
เป็นเรื่องที่ดีที่ต้องจำไว้ว่าcd/ pushdบางครั้งล้มเหลว (ตัวอย่างเช่นถ้าไม่มีไดเรกทอรี) pushd \windows && (foobar & popd)อาจเชื่อถือได้มากขึ้น
grawity

16

โดยค่าเริ่มต้นไฟล์แบตช์ของ Windows จะทำงานในบริบทของพาเรนต์เชลล์ (ซึ่งเป็นเรื่องผิดปกติสำหรับผู้ใช้ Unix ที่ต้องการความชัดเจนsourceแต่เป็นไปได้เพียงอย่างเดียวใน MS-DOS) ซึ่งหมายความว่าการเปลี่ยนแปลงไดเรกทอรีและตัวแปรสภาพแวดล้อมส่งผลกระทบต่อเชลล์แบบโต้ตอบดั้งเดิมด้วย

ใส่setlocalที่ด้านบนสุดของสคริปต์เพื่อให้มันทำงานในบริบทของตัวเอง - คุณสามารถใช้cdภายในสคริปต์ได้อย่างปลอดภัย


ขอบคุณดูเหมือนว่าสิ่งที่ฉันต้องการ - ฉันจะตรวจสอบเมื่อฉันเข้าถึงเครื่อง Windows สิ่งนั้นจะส่งผลกระทบต่อคำสั่งย่อยโดยใช้วงเล็บหรือไม่
เกร็ก

1
@Greg: ดูเหมือนว่า( )จะมีเพียงกลุ่มคำสั่งเข้าด้วยกัน แต่ยังคงเรียกใช้พวกเขาในบริบทหลัก (setlocal & cd foo & bar)จะไม่ทำงาน; แทนที่จะpushd foo && (bar & popd)ต้องการ
grawity

4

ดังที่ได้กล่าวถึงก่อนหน้านี้ grawity pushd \windows && (foobar & popd)จะทำงานได้ดีกว่าpushd \windows & foobar & popdเพราะหลังอาจล้มเหลวหากไม่มีไดเรกทอรีดังกล่าว

นอกจากนี้การใช้setlocalและendlocalอนุญาตให้คุณมีสภาพแวดล้อมหลายท้องถิ่นดังนั้นตัวอย่างเช่นคุณอาจมี:

setlocal

cd dir

command

endlocal

ตอนนี้คุณจะกลับมาในไดเรกทอรีเดิมของคุณ


3

คุณสามารถใช้cd -เพื่อกลับไปยังไดเรกทอรีการทำงานก่อนหน้า และใช้;แทน&&คำสั่งที่ตามมาจะไม่ขึ้นอยู่กับความสำเร็จของคำสั่งก่อนหน้า

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

ฉันได้อัปเดตคำถามเพื่อให้ความกระจ่างฉันกำลังถามเกี่ยวกับ windows batch / shell scripting ฉันรู้ว่าจะทำภายใต้เปลือกดวลจุดโทษเหมือน :)
เกร็ก

ในฐานะที่เป็น BillP3 ชี้ให้เห็นเทียบเท่ากับ ';' ในแบตช์ไฟล์คือ '&'
เกร็ก

ขอโทษด้วย การใช้เครื่องหมายทับซ้ายของคุณทำให้ฉันคิดว่ามันเป็น UNIX
bahamat

1

ฉันปรบมือให้ข้อเสนอแนะของ grawity ที่จะวางsetlocalที่จุดเริ่มต้นของสคริปต์ชุดของคุณ แต่ฉันจะเพิ่มความจริงที่ว่าคุณสามารถมีหลายซ้อนกันsetlocal/ endlocalบล็อกดังนั้นคำตอบที่เกี่ยวข้องกับคำถามอาจจะเป็น

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

และแน่นอนถ้าคุณต้องการคำสั่งที่จะดำเนินการเฉพาะในกรณีที่cdจะประสบความสำเร็จกับการพูดdir2cddir2&&command

หมายเหตุว่าsetlocal/ endlocalบล็อกสร้างสภาพแวดล้อมที่มีการแปลเป็นตัวแปรใด ๆ endlocalที่คุณตั้งค่าหรือการเปลี่ยนแปลงดังกล่าวในบล็อกจะกลับไปใช้ค่าก่อนหน้านี้หลังจากที่


0

คุณสามารถบันทึกไดเรกทอรีปัจจุบันลงในตัวแปร เปลี่ยนและเปลี่ยนกลับขึ้นอยู่กับค่าส่งคืนของคำสั่ง BTW,% CD% ส่งคืน DIR ปัจจุบันของคุณ

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