Thay đổi tạm thời thư mục cho lệnh bó tập tin duy nhất


19

Trong shell-scripting nếu tôi cần chạy một lệnh từ một thư mục, tôi có thể cho chúng tôi một subshell để đảm bảo tôi quay lại bối cảnh ban đầu:

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

Điều này có thể được thực hiện trong các tệp bó của Windows (hoặc tệp cmd)

Làm tương tự trong các tệp bó để lại cho tôi trong thư mục mới.

Tôi có thể làm:

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

Nhưng popd phụ thuộc vào sự thành công của command.

Có ý kiến ​​gì không?


Làm thế nào bạn gọi "tập tin bó" hoặc "tập tin cmd" của bạn? Nếu bạn đặt lệnh cd vào tập lệnh shell và thực thi tập lệnh đó (không phải nguồn đó), thư mục làm việc hiện tại của shell gọi sẽ không thay đổi.
garyjohn

Để rõ ràng, điều này đề cập đến các tệp bó của windows.
Greg

Đó là một tập lệnh chạy một loạt các lệnh trong các phần khác nhau của cây thư mục. Một số lệnh chỉ hoạt động trên thư mục hiện tại. Quay trở lại thư mục gốc giúp đơn giản hóa dữ liệu điều khiển tập lệnh. Bạn có đề xuất tạo một tệp bó riêng cho mỗi thư mục mà tôi cần thực hiện cuộc gọi không?
Greg

Như tôi nhớ, bạn đã đề cập đến các kịch bản shell và không đề cập đến Windows trong câu hỏi ban đầu của bạn, vì vậy tôi đã giả định không chính xác rằng bạn đang sử dụng một hệ thống giống như Unix. Bây giờ tôi hiểu rồi.
garyjohn

Vâng, xin lỗi, tôi nhận ra mình không rõ ràng (mặc dù tôi nghĩ rằng 'tệp bó' là một gợi ý :-p)
Greg

Câu trả lời:


21

Nếu bạn làm:

pushd \windows && foobar && popd

bạn sẽ bị bỏ lại (như bạn nêu) trong thư mục \ windows. Thử:

pushd \windows & foobar & popd

và bạn nên tìm lại chính mình nơi bạn bắt đầu.


1
Ah, vì vậy ampersand đơn tương đương với dấu chấm phẩy trong sh. Thật hoàn hảo. (và một tài liệu tham khảo: ss64.com/nt/syntax-conditable.html )
Greg

6
Thật tốt khi nhớ rằng cd/ pushdđôi khi thất bại (ví dụ nếu thư mục không tồn tại). pushd \windows && (foobar & popd)có thể đáng tin cậy hơn
grawity

16

Theo mặc định, các tệp bó của Windows được chạy trong ngữ cảnh của trình vỏ mẹ (điều này không bình thường đối với người dùng Unix, trong đó cần có một bản rõ ràng source, nhưng là khả năng duy nhất trong MS-DOS). Điều này có nghĩa là thay đổi thư mục và các biến môi trường cũng ảnh hưởng đến vỏ tương tác ban đầu.

Đặt setlocalở đầu tập lệnh của bạn để làm cho nó chạy trong ngữ cảnh của chính nó - sau đó bạn có thể sử dụng một cách an toàn cdbên trong tập lệnh.


Cảm ơn, Điều này nghe có vẻ như những gì tôi cần - Tôi sẽ kiểm tra nó khi tôi truy cập vào máy Windows. Điều đó sẽ ảnh hưởng đến các lệnh phụ sử dụng dấu ngoặc đơn?
Greg

1
@Greg: Có vẻ như ( )chỉ nhóm các lệnh với nhau, nhưng vẫn chạy chúng trong bối cảnh cha. (setlocal & cd foo & bar)sẽ không làm việc; thay vào đó pushd foo && (bar & popd)sẽ là cần thiết.
grawity

4

Như grawity đã đề cập trước đây, pushd \windows && (foobar & popd)sẽ hoạt động tốt hơn pushd \windows & foobar & popdbởi vì sau này có thể thất bại nếu không có thư mục như vậy.

Ngoài ra, sử dụng setlocalendlocalcho phép bạn có nhiều môi trường cục bộ, vì vậy, ví dụ bạn có thể có:

setlocal

cd dir

command

endlocal

Bây giờ bạn sẽ trở lại trong thư mục gốc của bạn.


3

Bạn có thể sử dụng cd -để quay lại thư mục làm việc trước đó. Và sử dụng ;thay vì &&, sau đó các lệnh tiếp theo sẽ không phụ thuộc vào sự thành công của các lệnh trước đó.

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

Tôi đã cập nhật câu hỏi để làm rõ Tôi đang hỏi về kịch bản lệnh bó / shell của windows. Tôi biết làm thế nào để làm điều đó dưới lớp vỏ giống như sh :)
Greg

Như BillP3rd đã chỉ ra tương đương với ';' trong các tệp bó là '&'.
Greg

Ồ xin lỗi. Việc bạn sử dụng dấu gạch chéo về phía trước khiến tôi nghĩ đó là UNIX.
bahamat

1

Tôi hoan nghênh đề xuất của grawity để đặt setlocalở đầu tập lệnh bó của bạn, nhưng tôi sẽ thêm một thực tế là bạn có thể có nhiều khối, lồng nhau, setlocal/ endlocalkhối, vì vậy một câu trả lời phù hợp hơn cho câu hỏi có thể là

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

Và, tất nhiên, nếu bạn muốn lệnh được thực thi chỉ khi cdđến dir2thành công, nói .cddir2&&command

Lưu ý rằng khối setlocal/ endlocaltạo một môi trường cục bộ, do đó, bất kỳ biến nào bạn đặt hoặc thay đổi trong khối đó sẽ trở lại giá trị trước đó sau giá trị đó endlocal.


0

Bạn có thể lưu thư mục hiện tại vào một biến. Thay đổi và thay đổi trở lại tùy thuộc vào giá trị trả về của lệnh. BTW,% CD% trả về TRỰC TIẾP hiện tại của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.