SORU
4 Kasım 2010, PERŞEMBE


Nasıl Windows Komut Yorumlayıcı (CMD.EXE) komut ayrıştırma mı?

Windows Komut Yorumlayıcı çalışacak yardımcı iyi bir toplu iş komut dosyaları yazmak için nasıl ilgili sağlar ss64.com rastladım.

Ancak, iyi bir açıklama bulmak mümkün olmuşturdilbilgisiişler genişletmek veya genişletmek değil nasıl, işler nasıl kaçacağını toplu komut dosyaları,.

Burada çözmek için mümkün olmamıştır, örnek sorular:

  • Nasıl teklif sistemi yönetilir? TinyPerl bir script yaptım
    ( foreach $i (@ARGV) { print '*' . $i ; } ), derlenmiş ve bu şekilde seslendi :
    • my_script.exe "a ""b"" c" seçeneğine çıkış *a "b*c
    • my_script.exe """a b c""" seçeneğine çıkışı 4**
  • Nasıl ** 5 iç komutu işe yarıyor mu? Bu komut içinde genişletilmiş nedir?
  • Neden dosya komut, ama interaktif oturumlar for [...] %I for [...] %%I kullanmak zorunda mıyım?
  • Kaçış karakterleri nelerdir, ve hangi bağlamda? Nasıl bir yüzde işareti kaçmak için? Örneğin, nasıl %PROCESSOR_ARCHITECTURE% kelimenin tam anlamıyla yankı miyim? echo.exe %""PROCESSOR_ARCHITECTURE% çalışır, orada daha iyi bir çözüm olduğunu buldum?
  • Nasıl % çift maç mı? Örnek:
    • set b=a , 12* → %a a c% *
    • set a =b, echo %a %b% c%bb c%
  • Nasıl bir değişken eğer tek bir değişken olarak bir komut geçer emin olun bu değişken çift tırnak bulunur?
  • Nasıl değişkenler set komutunu kullanırken saklı? set a=a" b echo.%a% yaparsam örneğin, a" b I elde edilir. Eğer ben ancak UnxUtils echo.exe a b. Nasıl %a% farklı bir şekilde genişletiyor geliyor?

Işıklar için teşekkür ederim.

CEVAP
4 Kasım 2010, PERŞEMBE


Bazı/birçok deney yaptım, ve bu ana sonuçlar gibi görünüyor.

Daha iyi parti nasıl çalıştığını anlamak için, ve bazen çalışır ve diğer zamanlarda kaçan neden başarısız gibi görünüyor. Bu, pek çok deneyler ile çalışıyorum ve ayrık faz sırasını tespit edebilirim diye testler yapıyorum.

Birden çok bölgeyi incelemek için vardır. Aldım

  • BatchLineParser - satır ya da bloklar için toplu dosya ayrıştırıcı içinde
  • CmdLineParser - BatchLineParser Gibi, ama komut satırında doğrudan istemi, farklı çalışır
  • - Nasıl/goto ve etiketlere iş arama LabelParser
  • Parantez ve önbelleğe alma Nasıl çalışır CommandBlockCaching -
  • Tokenizer - tek jeton(karakter grubu) oluşturmak Nasıl ve hangi aşamalarda

Bu BatchLineParser:

Bir toplu iş dosyasında bir kod satırı birden fazla aşama (komut satırında genişleme farklı!).

Süreci aşama 1 ile başlar

Faz/sipariş
1) Faz(Yüzde):

  • %% bir çift % bir tek değiştirilir
  • Bağımsız değişkenlerin genişleme (%1, %2, vb.)
  • Var ise %var% genişleme var hiçbir şey değiştirmez
  • Tam bir açıklama için okuyun dbenham bu Same thread: percent expansion

1.5) 29**. tümünü Kaldır (CarriageReturn 0x0d) satırından

2) Faz(, * <LF> ^ ** *33 34* ** *35 36* ( )*30 Özel Karakter:Her bir karakter olduğuna bak

  • Eğer bir teklif (") toggle alıntı bayrağı, alıntı bayrağı aktif, aşağıdaki özel karakterler artık özel: ^ & | < > ( ).
  • Eğer bir şapka işareti (^) bir sonraki karaktere sahip özel bir anlamı, işareti kendisi kaldırılır, eğer şapka son karakter satır, sonraki satıra eklenir, ilk firma, doğal taş konusunda bir sonraki her zaman ele olarak kaçtı firma, doğal taş konusunda.
    • <LF> ayrıştırma derhal durdurur, ama önünde bir şapka ile
  • Eğer bir özel karakterler & | < > bölme çizgisi bu noktada, boru (|) her iki parça alır bir aşamada yeniden (biraz daha karmaşık ...)Borular ayrıştırılır ve nasıl işleneceğini hakkında daha fazla bilgi için, bu soru ve cevaplara bak:Why does delayed expansion fail when inside a piped block of code?
  • Bu faz birincil simge listesi oluşturmak, belirteç sınırlayıcıları vardır <space> <tab> , ; = ve <0xFF> (olarak da bilinen non-breaking space)
  • İşlem parantez (birden fazla satır arasında bileşik açıklamaları sağlar):
    • Eğer çözümleyici bir komut belirteci arıyor eğer değilse, o zaman ( özel değildir.
    • Çözümleyici bir komut belirteci arıyor ve (, bulursa o zaman yeni bir bileşik deyim başlamak ve parantez sayacı artırmak
    • Parantez sayacı ^ ise . 62* *0 sonra bileşik deyim sona erer ve ters parantez azaltır.
    • Bu satırı sona ulaştı ve parantez sayacı >0 zaman bir sonraki satıra bileşik deyim (başlar yine faz 1) eklenir
    • Eğer parantez sayaç = 0 ve çözümleyici bir komutu arıyor ise, o zaman on line ) ve geri kalan tüm karakterler sayılır
  • Ve tespit İÇİN onlara özel kullanım için bu aşamada REM,,.
  • İlk belirteç "rem" sadece iki jeton işlenir, çok satırlı şapka . için önemliyse

3) Faz(eko):"Echo" evrenin ürünü 1 ve 2 . Baskı ise

  • -Döngü-blok birden çok kez, ilk kez döngü değişkenleri için unexpanded ile for-döngüsü bağlamında yankılandı
  • Her yineleme için, blok döngü değişkenleri için genişletilmiş yankılandı

---- Bu iki aşama gerçekten doğrudan aşağıdaki gibidir, ama hiç fark etmez
4) Faz (- döngü değişkenleri genişletme):%%a ve genişleme

5) Faz(Ünlem işareti):Eğer gecikmeli genişleme konusunda ise, her bir karakter olduğuna bak

  • Eğer bir şapka işareti (^) ise bir sonraki karakteri özel bir anlamı vardır, kaldırılmış kendisi şapka
  • Eğer bir ünlem işareti varsa, bir sonraki ünlem işareti (carets artık görülmez) arama, değişken içeriğini genişletmek
    • ! arka arkaya açılıyor ! bir tek içine çöktü
    • Bu olamaz eşleştirilmesi ! kalan kaldırılır
  • Eğer ünlem işareti, bu aşamada bulunursa, sonuç, faz 4 sonuç yerine kullanılır () carets için önemli atılır
  • Önemli: bu aşamada tırnak ve diğer specical karakterler göz ardı edilir
  • Bu aşamada vars genişletiyor "güvenli", çünkü özel karakterler artık algılanmaz (bile <CR> ya <LF>)

6) Faz(Ara/şapka katlama):Eğer cmd token çağrıdır

  • Eğer ilk simgesi "call", faz 1 ile tekrar başlar, ama faz 2, gecikmeli genişleme ikinci kez burada işlenmez . sonra durur ise
  • CALL çoklu ÇAĞRI yığılmış olabilir ilk kaldırın
  • Tüm carets (normal carets faz 2 ya da daha az, çünkü onlar değişmeden kalacak gibi görünüyor, ama tırnak içine alınmasını iki katına) çift

7) Aşaması(Yürütme):Komut yürütülür

  • Farklı simgeleri burada kullanılır, iç komutu bağlıdır idam edildi
  • Diye bir set "name=content" tam içeriğini ilk eşittir işareti ve en son teklif çizgisi olarak kullanılır içerik belirteci, yoksa alıntı sonra eşittir işareti, satırın geri kalan kısmını kullanılır.

CmdLineParser:

Çalışır BatchLine-Çözümleyici, ama olduğu gibi

  • Goto/etiket izin verilmez arayın

Aşama 1(Yüzde):

  • %var% var içeriği ile değiştirilecektir, eğer var ise tanımlı değil mi, expresssion bir değişiklik olmayacak
  • %%, İkinci yüzde hiçbir özel işlem var başında,=%%% İçeriği genişler var,% %içeriği% var set olabilir

Phase5(ünlem işareti):"DelayedExpansion" etkindir

  • !var! var olan içeriği ile değiştirilecektir, eğer var ise tanımlı değil mi, expresssion bir değişiklik olmayacak

-döngü-komut bloğu

örneğin for /F "usebackq" %%a IN (komut bloğu) DO echo %%a

Komut bloğu incelenemeyecek iki kez, ilk BatchLineParser(döngü içinde toplu) veya CmdLineParser(döngü komut satırı) aktif, ikincisi çalıştırmak her zaman CmdLineParser aktif. İkinci dönemde, DelayedExpansion kayıt defteri anahtarı ile Etkin ise aktiftir

İkinci çalışma cmd /c ile hat " demesi gibi

Değişkenlerin ayarı bu nedenle kalıcı değildir.

Yardımcı olur umarım Jan Erik

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • khloe brooks

    khloe brooks

    25 Temmuz 2011
  • LearnCode.academy

    LearnCode.ac

    20 Aralık 2012
  • michal lelkowski

    michal lelko

    9 Temmuz 2006