2010-11-11 100 views
7

我對這個主題,逗號與空格相比,在分隔參數方面有一些問題。cmd-逗號分隔參數相比空間?

他們是熟悉的命令提示符C程序員,也許能扔一些輕的問題..

我知道這樣

c:\>program a b c 

時,有4個參數[0]=program[1]=a[2]=b[3]=c

根據hh ntcmds.chm概念..

殼牌概述

; and , are used to separate parameters 

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

我看到dir a,b給出相同的結果dir a b

c:\>program a,b,c 給出參數[0] =節目[1] = A,B,C

那麼做一些?或所有? Windows命令使用;和?這是在每個命令的代碼中進行的解釋,還是由shell像空間一樣完成的?

如果它是在每個命令的代碼..我怎麼知道它是哪一個呢? 我注意到explorer.exe的文檔提到了逗號,例如。你可以做 explorer /e,.

但是DIR /?沒有提到它,但可以使用它。而一個典型的c程序並不需要,作爲一個分隔符..所以是這種情況,殼不使用逗號分隔,它使用空間。和windows命令一樣,這樣做'因爲它們是(全部?)寫入來限定shell使用逗號時進一步提供的參數嗎?

回答

4

有兩個不同位置的Unix和Windows之間:

  • 內部命令,如DIR內置在外殼;他們的命令行語法不必遵循與常規程序相同的規則。
  • 在Windows上,程序負責解析其自己的命令行。 Shell解析重定向和管道,然後將其餘命令行傳遞給一個字符串中的程序

使用Visual Studio構建的Windows C程序在Microsoft C運行庫中使用命令行解析器,它類似於典型的Unix shell解析器並遵從空格和引號。

我從來沒有見過使用,;作爲命令行分隔符的C程序。我意識到explorer /e,.的特例,但直到現在我纔看到dir a,b的例子。

+0

如何判斷shell執行了什麼操作,以及MS C運行時或標準庫執行了什麼操作?我有一個Windows C PROG只是#include 在頂部,以及顯示argv的代碼。使用gcc編譯。我看不到一種方法,我可以看到哪些「參數化!」是從shell完成的,而且是從標準庫自動執行的。另外,我注意到逗號不適用於外部程序xcopy或telnet。我想我已經看到了rundll32。我想這只是一些。可能不是一個公共可用庫中的函數!也許只是特殊的ext程序,它會執行cmd.exe的內部命令。 – barlop 2010-11-11 16:40:45

+0

除了shell功能,一切都是由MS C運行時完成的。 Shell功能包括重定向('<', '>'等''''),管道('|'),流量控制('&&'和'||')和轉義('^')等。 就像我說的,我從來沒有見過在命令行上使用'''的程序,所以我並不驚訝複製和telnet不支持它。 – 2010-11-11 17:35:13

+0

你是否建議ms c runtime確實分隔空格和引號?還是仍然是殼?如果它是ms c運行時,你能證明它嗎?我沒有看到你的第二個要點是如何區分unix,而windows的cos不是unix shell也是解析重定向和管道。 – barlop 2010-11-11 18:00:15

0

批處理文件使用逗號或分號作爲備用參數分隔符。

測試批處理文件:

@echo %1/%2/%3 

試運行:

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

而且,正如你注意,dir使用它,copy以及 - 這些都是shell內置並可能貫穿像批處理文件一樣的類似解析器(它不完全相同,因爲您可以執行諸如cd..dir/s這些其他任何操作都不可能的操作)。我猜(注意:推測)這是一種向後兼容性,可以回溯到DOS甚至CP/M天。現在你可能應該只使用空格。正如蒂姆指出的那樣,C運行時決定了某些關於參數的事情以及它們應該如何解析。許多其他語言/框架遵循該約定,但不一定全部。例如,PowerShell具有完全不同的參數處理方式,當與其中的本地程序進行交互時(有人說,PowerShell cmdlet和函數不是可在其他地方執行的程序,而是同時使用批處理文件),這有時會讓人感到意外。

+1

你寫道:「PowerShell cmdlet和函數不是可以在其他地方執行的程序,但批處理文件」應該不是不是,而是,刪除?像你說的批處理文件,同樣,不能從PowerShell運行,所以我不明白爲什麼有一個'但是'在那裏。 – barlop 2013-12-29 15:50:57