Làm cách nào để thoát khoảng trắng trong dòng lệnh trong Windows mà không sử dụng dấu ngoặc kép?


87

Ví dụ, cái gì thay thế cho lệnh này mà không có dấu ngoặc kép:

CD "c:\Documents and Settings"

Lý do đầy đủ tôi không muốn sử dụng dấu ngoặc kép là lệnh này KHÔNG hoạt động:

   SVN add mypathname\*.*

nhưng lệnh này KHÔNG hoạt động:

   SVN add "mypathname\*.*"

Vấn đề là khi tôi thay đổi tên của tôi cho một đường dẫn có khoảng trắng trong đó tôi cần trích dẫn toàn bộ. Ví dụ:

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

Nhưng khi tôi thử điều này, tôi nhận được thông báo lỗi sau:

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

2
bạn có nghĩa là bạn có một lý do chính đáng cho việc 'không' muốn sử dụng dấu ngoặc kép.
Thomas

Tại sao, là dấu ngoặc kép của bạn bị hỏng? :)
slhck

3
@slhck Đừng lo lắng phím shift và phím số 2 của tôi hoàn toàn ổn! Tôi đang sử dụng một lệnh không xuất hiện để cho phép ký tự đại diện khi chúng xuất hiện bên trong dấu ngoặc kép là tất cả!
David

1
@MarkBooth và @WeltenWanderer thử nhưng không may là nó không hoạt động. Trong cả 3 trường hợp, tôi nhận được "svn: Lỗi giải quyết trường hợp ....."
David

1
Bạn đã thử định dạng 8.3 cũ của tên (DOCUME ~ 1) chưa?
Justin Pearce

Câu trả lời:


54

Nó hầu như đều hoạt động với tôi, nhưng có lẽ bạn đã thử dòng5 .. thoát khỏi không gian bằng biểu tượng dấu mũ (^)

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:\>

Hoặc ví dụ dưới đây, nơi caret thực sự làm cho tất cả sự khác biệt.

Nhìn từ bên dưới giống như biểu tượng dấu mũ có thể là câu trả lời của bạn, xem dòng 3 bên dưới.

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:\>

vì lật đổ là công cụ của lập trình viên, nó có thể phù hợp với SO. đây là một câu hỏi liên quan stackoverflow.com/questions/757435/ Có thể là bạn sử dụng dấu ngoặc kép hoặc dấu mũ để đưa nó đến svn, sau đó có lẽ bạn sử dụng dấu gạch chéo ngược trước mỗi dấu cách
barlop

bạn cũng có thể dùng thử svn của Cygwin, nếu tò mò .. với một số câu trả lời mẫu trong câu hỏi đó và xem liệu có bất kỳ hoặc biến thể nào của chúng hoạt động cho bạn không.
barlop

5
Biểu tượng dấu mũ trực tiếp trả lời câu hỏi của tôi vì vậy tôi sẽ chấp nhận câu trả lời của bạn. Thật không may, lệnh SVN dường như không nhận ra nó! Nếu tôi dùng thử, tôi nhận được thông báo lỗi này "svn 'C:' không phải là bản sao hoạt động". Tôi có một cách khác xung quanh nó và đó chỉ đơn giản là 'cd' vào thư mục trước sau đó thực thi lệnh SVN một lần ở đó. Tôi thậm chí có thể xâu chuỗi hai lệnh lại với nhau trong một dòng bằng cách sử dụng toán tử &&: cd "c: \ Documents and Settings \ username \ svn" && SVN add *. *
David

trong ví dụ về CD, caret không cần thiết, CD không cần không gian thoát
barlop

1
@ Chinggis6 thú vị .. nó cũng không hoạt động cho DIR. Cả bản sao và thư mục đều được xây dựng trong các lệnh .. mặc dù vậy CD cũng vậy. Mặc dù bản sao và thư mục lấy tên tệp làm tham số. Có thể đáng để hỏi trên diễn đàn
dostips

35

Tôi thấy rằng việc đặt dấu ngoặc kép chỉ là một phần của vị trí hoạt động. Trong trường hợp của bạn:

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

Mặc dù điều này sử dụng dấu ngoặc kép, nhưng điều quan trọng cần lưu ý là dấu hoa thị nằm ngoài dấu ngoặc kép, vì vậy chúng vẫn hoạt động chính xác.


7
Ngoài ra, nếu muốn tối giản, người ta có thể trích dẫn xung quanh chỉ khoảng trắng hoặc chỉ các ký tự chứa khoảng trắng, ví dụ: tài liệu C: \> cd "và se" (mặc dù đó là ví dụ cd, người ta không cần phải thoát dấu cách)
barlop

1
Cảm ơn rất nhiều. Tôi có thể đã nâng cấp 4 hoặc 5 lần nếu có thể ..
Sayka

@Sayka Câu hỏi đã hỏi "Làm cách nào để thoát khoảng trắng trong dòng lệnh trong Windows mà không sử dụng dấu ngoặc kép? "
barlop

2
@barlop Chắc chắn, nhưng lý do không có dấu ngoặc kép là vì dấu hoa thị không thực hiện công việc của nó khi nó nằm trong dấu ngoặc kép. Giải pháp tôi đã đưa ra để tránh vấn đề này vì các dấu sao nằm ngoài dấu ngoặc kép. Câu trả lời này không tuân theo thư của câu hỏi, nhưng nó tuân theo tinh thần của câu hỏi (nghĩa là nó hoạt động cho mục đích đã định).
Kit Johnson

25

Mặc dù các câu trả lời cho ảo tưởng rằng nó hoạt động, thực tế là bạn không thể lẻn vào không gian vào các đối số cmd thông thường. Điều này rất dễ chứng minh:

  1. Lưu " echo %1" như test.bat. Tệp bó này sẽ xuất đối số đầu tiên mà cmd vượt qua chúng ta.

  2. Bây giờ, hãy thử và chạy test.bat, thiết lập giá trị của %1để foo bar. (Lưu ý rằng có một khoảng trống giữa foobar.)

  3. Thử và sai trong vài năm và nhận ra rằng không có cách nào để làm điều đó . Mọi người sẽ đề nghị thoát bằng cách sử dụng ^, nhưng test.bat foo^ barsẽ không xuất ra foo bar.

Vì vậy, không có cách nào để có được đầu ra foo bar, và gần nhất chúng ta có thể nhận được là chạy test.bat foo" "barsản xuất foo" "barhoặc chạy test.bat "foo bar"sản xuất "foo bar".


Bây giờ, lý do các câu trả lời khác xuất hiện để làm việc là vì cdkhông riêng của nó phân tích cú pháp bổ sung, phân kỳ từ hành vi của các đối số thường đi qua (như thường lệ %1, %2, %3và vv trong các tập tin batch điển hình).

Ví dụ, hãy xem xét lệnh đặc biệt:

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

Tại sao nó hoạt động? Điều này là do cd bản thân nó đang làm một cái gì đó tương đương với việc nối 7 đối số thông thường thành một đối số hợp lý. Theo các đối số cmd vượt qua các chỉ tiêu, chúng ta thấy 7 đối số:

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

Dường như cdđã kết hợp tất cả 7 đối số thành một đối số hợp lý, thực hiện một cái gì đó tương tự array.join(" "), tạo ra đường dẫn:

c:\documents and settings \some folder with spaces

Lưu ý rằng hành vi này là đặc biệt cdchỉ (và một số chức năng khác). Nó không có gì để làm với thông qua tranh luận thông thường.


Thật vậy, cdcó một đặc thù khác. Hãy nhớ rằng chúng tôi đã nêu ở trên rằng chúng tôi không thể có được đầu ra foo bar? Đầu ra gần nhất mà chúng ta có thể nhận được là bằng cách chạy:

test.bat foo" "bar

mà sản xuất foo" "bar, hoặc:

test.bat "foo bar"

mà sản xuất "foo bar", hoặc:

test.bat "foo "bar

mà sản xuất "foo "bar, hoặc:

test.bat foo" bar"

mà sản xuất foo" bar", hoặc:

test.bat "foo b"ar

mà sản xuất "foo b"ar, hoặc:

test.bat fo"o bar"

mà sản xuất fo"o bar", hoặc:

test.bat fo"o ba"r

mà sản xuất fo"o ba"r, hoặc:

test.bat "fo"o" bar"

mà sản xuất "fo"o" bar", hoặc:

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

mà sản xuất "f""o""o"" ""b""a""r", hoặc thậm chí:

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

mà sản xuất """"f"""o""""o"" ""ba"""r"""""""""".

Tất cả các ví dụ trên có một điểm tương đồng, đó là chúng sẽ tạo ra foo barsau khi chúng tôi cắt bớt "ký tự. cdTác giả chắc cũng đã nhận ra điều này ... nếu chúng ta suy ra cdhành vi kỳ dị của nó, loại bỏ tất cả những "gì nó nhận được , cho phép tất cả các lệnh này hoạt động:

  • 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


15
Thật là một chương trình lập trình lộn xộn của windows ...
Klangen 7/03/2016

Cảm ơn. Chúng tôi có thể xác định nếu CD đang sử dụng argv[]hay GetCommandLine()không? pastebin.com/raw/t55iv0JS
barlop

7

Tên tệp ngắn dường như hoạt động như một làn gió.

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

Để tăng cường bộ nhớ ..;)


8
nó có thể không hoạt động nếu tên tệp ngắn đã bị vô hiệu hóa
phuclv


2

Đối với những người nói về thay thế 8.3, xin lưu ý hai điều sau đây:

  • 8.3 có thể được đặt thành bị tắt (hoặc bật) trên NTFS, vì vậy nó không phải lúc nào cũng tồn tại.
  • Tên 8.3 của tệp / thư mục có thể thay đổi mà không cần thông báo chỉ bằng cách tạo, đổi tên hoặc xóa những thứ khác trong cùng một thư mục.

Vì vậy, c:\docume~1có thể chỉ ra:

  • Không ở đâu (không hợp lệ)
  • Thư mục bạn muốn
  • Một thư mục khác
  • Một thư mục biến theo thời gian

Nó không an toàn, trừ khi bạn có được tên ngắn và sử dụng nó trong các hoạt động nguyên tử.

Mặc dù rất ít khi họ thay đổi, nhưng điều phổ biến là họ không tồn tại.

Nếu bạn muốn biết nếu 8.3 tồn tại cho một thư mục / tệp cụ thể, hãy kiểm tra nó với tham số /Xtrên một dirlệnh hoặc đóng gói nó trên forđể chỉ lấy phần đó, v.v.

Để biết thêm về cách bật / tắt 8.3 trên NTFS, hãy xem bài viết hỗ trợ này của Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- tạo-trên-ntfs-phân vùng


0

Theo dõi bài đăng của @ Pang và những người khác thảo luận về tên ngắn và những cạm bẫy, đây là cách để tự động giải quyết một tên dài thành một tên ngắn:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Sau đó, rõ ràng bạn có thể sử dụng tên ngắn hơn là dấu ngoặc kép xung quanh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.