題 如何在不使用引號的情況下在Windows命令行中轉義空格?


例如,沒有引號的此命令的替代方法是什麼:

CD "c:\Documents and Settings"

我不想使用引號的全部原因是這個命令工作:

   SVN add mypathname\*.*

但是這個命令不起作用:

   SVN add "mypathname\*.*"

問題是,當我為其中包含空格的路徑更改mypathname時,我需要引用整個事情。例如:

SVN add "c:\Documents and Settings\username\svn\*.*"

但是當我嘗試這個時,我收到以下錯誤消息:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

74
2018-05-04 12:54


起源


你的意思是你有充分的理由'不'想要使用引號。 - Thomas
為什麼,你的引號鍵是否破損? :) - slhck
@slhck別擔心我的換檔鍵和2號鍵完全沒問題!我正在使用一個看起來不允許使用通配符的命令,當它們出現在所有引號內時! - David
@MarkBooth和@WeltenWanderer很好的嘗試,但遺憾的是這不起作用。在所有3個案例中,我得到一個“svn:錯誤解決.....的情況” - David
您是否嘗試過舊的8.3格式名稱(DOCUME~1)? - Justin Pearce


答案:


它幾乎都適合我,但你有沒有試過line5 ..用插入符號逃避空間(^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

或者例如在下面,插入符號確實有所不同。

從下面看起來像插入符號可能是你的答案,見下面的第3行。

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>

44
2018-05-04 16:59



因為subversion是程序員的工具,所以它可能適合SO。這是一個相關的問題 stackoverflow.com/questions/757435/...       它可能是你使用引號或插入符號來獲取svn,那麼也許你在每個空格之前使用反斜杠 - barlop
你也可以試試cygwin的svn,如果好奇的話......在這個問題中有一些示例答案,看看它們中是否有任何或各種變化。 - barlop
插入符號直接回答我的問題所以我會接受你的回答。不幸的是,SVN命令似乎無法識別它!如果我嘗試它,我收到此錯誤消息“svn'C:'不是工作副本”。我還有另一種方法,那就是首先簡單地“cd”到目錄,然後在那裡執行SVN命令。我甚至可以使用&&運算符將兩個命令鏈接在一起:cd“c:\ Documents and Settings \ username \ svn”&& SVN add *。* - David
在CD示例中,插入符號不是必需的,CD不需要空間轉義 - barlop
@ Chinggis6有趣..它對DIR也不起作用。 copy和dir都是用命令構建的。雖然CD也是如此。雖然copy和dir採用文件名作為參數。可能值得在dostips論壇上詢問 - barlop


我發現只在該位置的一部分附近放置引號。在你的情況下:

SVN add C:\"Documents and Settings"\username\svn\*.*

雖然這使用引號,但重要的是要注意星號是  引號,所以他們仍然正常運作。


31
2018-04-24 07:45



如果一個人想要簡約,那麼就可以在空間周圍做引用,或者僅僅包含空間的字符,例如C:\> cd文檔“和se”ttings(儘管那個cd例子,一個不需要轉義空格) - barlop
非常感謝。如果可能的話,我可能會投票4到5次。 - Sayka
@Sayka問題確實問到“如何在Windows中命令行中轉義空格 沒有使用引號?“ - barlop
@barlop當然,但沒有引號的原因是當星號在引號內時,星號不起作用。我給出的解決方案避免了這個問題,因為星號在引號之外。這個答案不遵守 信件 問題,但它遵守 精神 問題(即,它是否適用於預期目的)。 - Kit Johnson


儘管答案給出了它起作用的錯覺,但事實是你不能將空間隱藏在通常的cmd參數中。這很容易證明:

  1. 保存 ”echo %1“作為 test.bat。該批處理文件將輸出cmd傳遞給我們的第一個參數。

  2. 現在,嘗試並運行 test.bat,設置值 %1 至 foo bar。 (注意,之間有一個空格字符 foo 和 bar。)

  3. 試錯幾年並意識到這一點 沒有辦法做到這一點。人們會建議逃避使用 ^然而 test.bat foo^ bar 不會輸出 foo bar

所以,沒有辦法獲得輸出 foo bar,我們可以得到的最接近的是 test.bat foo" "bar 哪個產生 foo" "bar或者跑步 test.bat "foo bar" 哪個產生 "foo bar"


現在,對方回答的原因 出現 工作是因為 cd 不 它自己的 額外的解析,偏離通常的參數傳遞的行為(通常的 %1%2%3 典型批處理文件中的等等)。

例如,考慮一下特殊的命令:

cd c:\documents and settings \some folder with spaces

它為什麼有效?這是因為 cd  本身 做一些相當於加入7的事情 通常 爭論成一個邏輯的。根據cmd參數傳遞規範,我們看到7個參數:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

就好像 cd 將所有7個參數加入到一個邏輯中,做了類似的事情 array.join(" "),產生路徑:

c:\documents and settings \some folder with spaces

請注意,此行為是 特有的 cd 只要 (和其他一些功能)。它與通常的論證傳遞無關。


確實, cd 有另一個特點。記住我們上面說過我們無法得到輸出 foo bar?我們可以獲得的最接近的輸出是運行:

test.bat foo" "bar

哪個產生 foo" "bar, 要么:

test.bat "foo bar"

哪個產生 "foo bar", 要么:

test.bat "foo "bar

哪個產生 "foo "bar, 要么:

test.bat foo" bar"

哪個產生 foo" bar", 要么:

test.bat "foo b"ar

哪個產生 "foo b"ar, 要么:

test.bat fo"o bar"

哪個產生 fo"o bar", 要么:

test.bat fo"o ba"r

哪個產生 fo"o ba"r, 要么:

test.bat "fo"o" bar"

哪個產生 "fo"o" bar", 要么:

test.bat "f""o""o"" ""b""a""r":

哪個產生 "f""o""o"" ""b""a""r", 甚至:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

哪個產生 """"f"""o""""o"" ""ba"""r""""""""""

所有上述例子都有一個相似之處,即它們會產生 foo bar 在我們修剪掉之後 " 字符。 cd作者也必須意識到這一點......如果我們要從中推斷出來的話 cd這是一種奇特的行為 削減所有 " 它接收,允許所有這些命令工作:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs


22
2017-08-26 02:01



什麼亂七八糟的批量編程...... - Flermat
謝謝。我們可以確定CD是否正在使用 argv[] 要么 GetCommandLine() ? pastebin.com/raw/t55iv0JS - barlop


短文件名似乎輕而易舉。

“E:\ Progra~1 \ Java \ Eclipse \ eclipse.exe”-vmargs -Xms1024m -Xmx2048m

為了增加記憶..;)


7
2018-04-19 07:51



如果禁用了短文件名,它可能無法正常工作 - phuclv


使用8.3短文件名。例如:

If exist c:\docume~1 goto :Ifoundthesucker

3
2017-10-03 14:47



見LưuVĩnhPhúc的評論 Milorulez的回答。 - Gerold Broser


關於8.3替換的說法,你知道這兩件事嗎:

  • 8.3可以在NTFS上設置為禁用(或啟用),因此它們可能不會總是存在
  • 8.3文件/文件夾的名稱可以通過創建,重命名或刪除同一文件夾上的其他內容而無需更改

所以 c:\docume~1 可以指向:

  • 不在哪裡(無效)
  • 您想要的文件夾
  • 另一個夾子
  • 隨時間變化的文件夾

這是不安全的,除非你得到短名稱並在原子操作中使用它。

說,他們改變是非常罕見的,但他們不存在是很常見的。

如果你想知道特定文件夾/文件是否存在8.3,則在dir命令中使用paramenter / X對其進行測試...或將其封裝在for上以僅獲取該部分等。

如果有關於如何在NTFS上啟用/禁用8.3的更多信息,請參閱M $ web:

https://support.microsoft.com/es-es/help/121007/how-to-disable-8.3-file-name-creation-on-ntfs-partitions


1
2018-05-12 08:43