Tek bir toplu iş dosyası komutu için dizini geçici olarak değiştirme


19

Kabuk komut dosyasında bir dizinden bir komut çalıştırmanız gerekirse, orijinal bağlama geri dönmemizi sağlamak için bize bir alt kabuk verebilirim:

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

Bu Windows toplu iş dosyalarında (veya cmd dosyalarında) yapılabilir

Aynı işlemi toplu iş dosyalarında yapmak beni yeni dizinde bırakıyor.

Yapabilirim:

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

Ancak popd, başarısına bağlıdır command.

Herhangi bir fikir?


"Batch-file" veya "cmd-file" dosyalarınızı nasıl çağırıyorsunuz? Bir kabuk komut dosyasına bir cd komutu koyarsanız ve bu komut dosyasını çalıştırırsanız (kaynak değil), çağıran kabuğun geçerli çalışma dizini değişmez.
garyjohn

Açıkçası, bu windows toplu iş dosyalarına atıfta bulunuyor.
Greg

Bir dizin ağacının farklı bölümlerinde bir sürü komut çalıştıran bir komut dosyası. Bazı komutlar yalnızca geçerli dizinde çalışır. Orijinal dizine geri dönmek, komut dosyasını çalıştıran verilerin basitleştirilmesine yardımcı olur. Arama yapmam gereken her dizin için ayrı bir toplu iş dosyası hazırlamanızı mı öneriyorsunuz?
Greg

Hatırladığım gibi, kabuk komut dosyalarına atıfta bulundunuz ve orijinal sorunuzda Windows'tan bahsetmediniz, bu yüzden yanlış Unix benzeri bir sistem kullandığınızı varsaydım. Şimdi anladım.
garyjohn

Evet, üzgünüm, net olmadığımı fark ettim ('toplu dosya' bir ipucu olduğunu düşünüyorum :-p)
Greg

Yanıtlar:


21

Yaparsan:

pushd \windows && foobar && popd

\ windows klasöründe kalırsınız (belirttiğiniz gibi). Deneyin:

pushd \windows & foobar & popd

ve kendinizi başladığınız yere geri götürmelisiniz.


1
Ah, bu yüzden tek ve işareti sh cinsinden yarı-kolonun karşılığıdır. Bu mükemmel. (ve referans: ss64.com/nt/syntax-conditional.html )
Greg

6
It en iyi hatırlamak cd/ pushd(dizin yoksa, örneğin) bazen başarısız olur. pushd \windows && (foobar & popd)daha güvenilir olabilir
user1686

16

Varsayılan olarak, Windows toplu dosyaları (açık Unix kullanıcıları için sıradışı ebeveyn Shell'in bağlamında çalışır source, MS-DOS tek olasılık gereklidir, ancak idi). Bu araçlar dizini değiştirir ve çevre değişkenleri çok özgün interaktif kabuk etkiler.

Put setlocalkendi bağlamında çalışacak hale getirmek için komut üstündeki - Sen kullanımı güvenli cancd daha sonra komut dosyasının içinde .


Teşekkürler, Bu ihtiyacım olana benziyor - Bir Windows makinesine eriştiğimde kontrol edeceğim. Bu parantez kullanarak alt komutları etkiler mi?
Greg

1
@Greg: Görünüşe göre ( )sadece komutları bir arada gruplandırıyorlar, fakat yine de bunları ana bağlamda çalıştırıyorlar. (setlocal & cd foo & bar)çalışmayacak; bunun yerine pushd foo && (bar & popd)gerekli olacaktır.
user1686

4

Daha önce bahsedildiği gibi, böyle bir dizin yoksa ikincisi başarısız olabileceğinden pushd \windows && (foobar & popd)daha önce işe yarayacaktır pushd \windows & foobar & popd.

Ayrıca, kullanmak setlocalve endlocalbirden çok yerel ortama sahip olmanızı sağlar, böylece örneğin:

setlocal

cd dir

command

endlocal

Artık orijinal dizinde geri olacaktır.


3

cd -Önceki çalışma dizinine geri dönmek için tuşunu kullanabilirsiniz . Ve ;yerine kullanmak &&, sonraki komutlar önceki komutların başarısına bağlı olmayacaktır.

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

Windows toplu / kabuk komut dosyası hakkında soruyorum açıklamak için soru güncelledim. Ben sh benzeri bir kabuk altında nasıl yapılacağını biliyorum :)
Greg

BillP3rd'ün işaret ettiği gibi ';' toplu iş dosyalarında '&' bulunur.
Greg

Ah Üzgünüm. Eğik çizgi kullanman beni UNIX olduğunu düşündürdü.
bahamat

1

Grawity'nin setlocaltoplu komut dosyanızın başına koymak için önerisini alkışlıyorum , ancak birden çok, iç içe setlocal/ endlocalblok olabileceğinizi ekliyorum , bu yüzden soruya daha alakalı bir cevap olabilir

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

Ve elbette, komutun yalnızca cdto dir2başarılı olursa yürütülmesini istiyorsanız,cddir2&&command .

O Not setlocal/ endlocalherhangi değişkenler ayarladığınız veya böyle bir blokta değişiklik sonrasında eski değerine geri dönecektir böylece blok, yerelleştirilmiş bir ortam oluşturur endlocal.


0

Bir değişkene geçerli dizini kaydedebilirsiniz. Değişim ve değişim geri komutunun dönüş değerine bağlı. BTW,% CD% geçerli DIR döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.