2010-11-11 18 views
7

Parametre sınırlamada konuyla ilgili, virgüllerin uzay ile karşılaştırıldığında bazı sorularım var.cmd-virgülle karşılaştırıldığında?

Onlar 4 parametre [0]=program[1]=a[2]=b[3]=c vardır ben

c:\>program a b c 

yaparken biliyoruz

.. cmd istemi aşina C programcıları, biraz ışık atmak mümkün olabilir soruları vardır

hh ntcmds.chm kavramlarına göre ..

Kabuk genel I dir a,b bkz

; and , are used to separate parameters 

; or , command1 parameter1;parameter2 Use to separate command parameters. 

c

c:\>program a,b,c parametreleri [0] = Program [1] = a, b verir dir a b

ancak

aynı sonucu verir Yani biraz yapalım mı? ya da hepsi? windows komutları kullanır; ve , ? ve bu, her bir komutun kodu içindeki yorumlama mıdır, yoksa kabuk tarafından boşlukla mı yapıldı?

Ve eğer her bir komutun kodunda ise .. hangisinin olduğunu nasıl bilebilirim? Ben explorer.exe belgelerinin virgül, örn. explorer /e,.

ancak DIR /? bahsetmez, ancak kullanabilir. Ve tipik bir c programı, bir sınırlayıcı olarak almaz .. Kabuk, sınırlamak için virgül kullanmazsa, alan kullanır. Ve pencere komutları bunu yapar, çünkü virgül kullanıldıklarında kabukların daha fazla verdikleri parametreleri sınırlamak için yazılırlar (hepsi?).

cevap

4

iki fark Unix ve Windows arasında burada vardır: Böyle DIR olarak

  • İç komutlar kabuk yerleştirilmiştir; komut satırı sözdizimi, normal programlar için aynı kurallara uymak zorunda değildir.
  • Windows'da, programlar kendi komut satırlarını ayrıştırmaktan sorumludur. Kabuk sonra bir dizesinde programa komut satırının geri kalanını geçer, yönlendirmeleri ve boruları ayrıştırır
Visual Studio bir benzer Microsoft C çalışma zamanı komut satırı ayrıştırıcı kullanmak kullanılarak inşa

Windows C programları Tipik Unix kabuk ayrıştırıcısı ve boşluklara ve tırnak işaretlerine uyuyor.

Hiç bir komut satırı ayırıcısı olarak , veya ; kullanan bir C programı görmedim. explorer /e,. için özel durumun farkındaydım, ancak şu ana kadar dir a,b örneğini hiç görmedim.

+0

Kabuk tarafından ne yapıldığını ve MS C çalışma zamanı veya standart lib tarafından yapılanları nasıl anlayabilirsiniz? Sadece bir pencere c prog var sadece #include üstünde ve argv görüntülemek için kod. gcc ile derlenmiş.Kapıdan hangi "parameterization!" yapıldığını görebiliyorum ve standart kütüphaneden otomatik olarak bir yol göremiyorum.Ayrıca, virgülün harici programlar xcopy veya telnet için çalışmadığını görüyorum. Sanırım rundll32 için gördüm. Sanırım bu sadece bazı.Maybe edilebilir bir kütüphanede bir fonksiyon değil.Bir belki sadece istisnai ext programlar cmd.exe iç cmds aping yapıyor – barlop

+0

Her şey kabuk işlevselliği dışında MS C çalışma zamanı tarafından yapılır. Kabuk işlevselliği yeniden yönlendirme ('<', '>', vb '>>), borulama ('|'), akış denetimi (' && 've' || ') ve kaçma ('^') gibi şeyleri içerir. Dediğim gibi, komut satırında ',' komutunu kullanan bir program görmedim, bu yüzden kopyalamanın ve telnetin desteklemediğine şaşırmadım. –

+0

ms c çalışma zamanının boşlukları ve teklifleri sınırlandırdığını mı öneriyorsunuz? ya da bu hala kabuk mu? ve eğer ms c çalışma zamanı iseniz, bunu ispatlayabilir misiniz? İkinci mermi noktanızın unix ve windows'u nasıl ayırt ettiğini göremiyorum çünkü unix ve shell'ler de ayrıştırılamıyor. – barlop

0

Toplu iş dosyaları, alternatif bir argüman ayırıcı olarak virgül veya noktalı virgül kullanın.

Testi toplu iş dosyası:

@echo %1/%2/%3 

test çalışması:

> test.cmd 1,2,3 
1/2/3 
> test.cmd 1;2 3 
1/2/3 

Ve, not olarak, dir yanı copy, onu kullanan - bu hem kabuk yerleşik ins ve muhtemelen içinden çalıştırmak Toplu iş dosyaları gibi benzer bir ayrıştırıcı da (tam olarak aynı değil, cd.. veya dir/s gibi şeyler yapabileceğiniz için başka hiçbir şey mümkün değildir). Sanırım (not: spekülasyon) bu, DOS'a veya hatta CP/M günlerine geri dönen bir çeşit geriye dönük uyumluluk. Günümüzde muhtemelen sadece boşluk kullanmalısınız. Tim'in belirttiği gibi, C çalışma zamanı argümanlar ve bunların nasıl ayrıştırılacağı ile ilgili bazı şeyleri belirler. Birçok başka dil/çerçeve, bu kongeyi izler, ancak mutlaka hepsine ait değildir. PowerShell, örneğin tamamen farklı argüman işleme özelliğine sahiptir ve bu, içerisinden yerel programlarla etkileşimde bulunduğunda bazen bir sürpriz olabilir (PowerShell cmdlet'leri ve işlevleri başka bir yerde hiçbir programda çalıştırılamaz, ancak toplu iş dosyaları da benzer şekilde).

+1

"PowerShell cmdlet'lerini ve işlevlerini başka bir yerde hiçbir program çalıştırılamıyor, ancak toplu iş dosyaları aynı şekilde yazdınız" diye bir şey yazmadınız ve değil mi? Toplu iş dosyaları, siz de dediğiniz gibi, powershell'den çalıştırılamaz, bu yüzden neden orada olduğunu göremiyorum. – barlop

İlgili konular