Bagaimana cara melepaskan spasi di baris perintah di Windows tanpa menggunakan tanda kutip?

88

Misalnya apa alternatif dari perintah ini tanpa tanda kutip:

CD "c:\Documents and Settings"

Alasan lengkap saya tidak ingin menggunakan tanda kutip adalah bahwa perintah ini TIDAK berfungsi:

   SVN add mypathname\*.*

tetapi perintah ini TIDAK berfungsi:

   SVN add "mypathname\*.*"

Masalahnya adalah ketika saya mengubah mypathname untuk path dengan spasi di dalamnya, saya perlu mengutip semuanya. Sebagai contoh:

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

Tetapi ketika saya mencoba ini saya mendapatkan pesan kesalahan berikut:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
David
sumber
2
Anda berarti Anda memiliki alasan yang kuat untuk 'tidak' ingin menggunakan tanda kutip.
Thomas
Mengapa, kunci tanda kutip Anda rusak? :)
slhck
3
Sslhck. Jangan khawatir, tombol shift saya dan tombol nomor 2 sudah oke! Saya menggunakan perintah yang tampaknya tidak mengizinkan wildcard ketika mereka muncul di dalam tanda kutip itu saja!
David
1
@MarkBooth dan @WeltenWanderer percobaan yang bagus tapi sayangnya ini tidak berhasil. Dalam semua 3 kasus saya mendapatkan "svn: Kasus penyelesaian kesalahan ....."
David
1
Sudahkah Anda mencoba format 8.3 nama lama (DOCUME ~ 1)?
Justin Pearce

Jawaban:

55

Ini hampir semua berfungsi untuk saya, tetapi apakah Anda mungkin mencoba line5 .. keluar dari ruang dengan simbol tanda sisipan (^)

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

Atau misalnya di bawah ini di mana tanda sisir benar-benar membuat perbedaan.

Tampak dari bawah seperti simbol caret mungkin jawaban Anda, lihat baris 3 di bawah ini.

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:\>
barlop
sumber
karena subversi adalah alat programmer, mungkin cocok untuk SO. di sini adalah pertanyaan terkait stackoverflow.com/questions/757435/... bisa jadi Anda menggunakan tanda kutip atau tanda sisipan untuk mendapatkannya ke svn, maka mungkin Anda menggunakan backslash sebelum setiap ruang
barlop
Anda juga bisa mencoba cygwin svn, jika penasaran .. dengan beberapa contoh jawaban dalam pertanyaan itu dan lihat apakah ada atau variasi di antaranya cocok untuk Anda.
barlop
5
Simbol caret tidak langsung menjawab pertanyaan saya jadi saya akan menerima jawaban Anda. Sayangnya perintah SVN tampaknya tidak mengenalinya! Jika saya mencobanya saya mendapatkan pesan kesalahan ini "svn 'C:' bukan salinan yang berfungsi". Saya punya cara lain untuk mengatasinya dan itu cukup dengan 'cd' ke direktori terlebih dahulu kemudian jalankan perintah SVN di sana. Saya bahkan dapat menggabungkan kedua perintah bersamaan dalam satu baris menggunakan operator &&: cd "c: \ Documents and Settings \ username \ svn" && SVN add *. *
David
dalam contoh CD, tanda sisipan tidak diperlukan, CD tidak perlu ruang melarikan diri
barlop
1
@ Chinggis6 menarik .. tidak berfungsi untuk DIR juga. Baik copy dan dir dibangun di perintah .. meskipun begitu juga CD. Meskipun salin dan dir mengambil nama file sebagai parameter. Mungkin patut ditanyakan di forum
dostips
35

Saya menemukan bahwa menempatkan tanda kutip di sekitar hanya satu bagian dari lokasi berfungsi. Dalam kasus Anda:

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

Meskipun ini menggunakan tanda kutip, yang penting untuk diperhatikan adalah tanda bintang berada di luar tanda kutip, sehingga tanda itu masih berfungsi dengan benar.

Kit Johnson
sumber
7
juga jika seseorang ingin menjadi minimalis, seseorang dapat melakukan tanda kutip hanya di sekitar ruang atau hanya karakter yang mengandung ruang, misalnya C: \> dokumen cd "dan melihat" (meskipun dalam contoh cd, kita tidak perlu melarikan diri spasi)
barlop
1
Terima kasih banyak. Saya mungkin telah memilih 4 atau 5 kali jika memungkinkan ..
Sayka
@ Samka Pertanyaannya memang bertanya "Bagaimana cara saya melarikan diri spasi di baris perintah di Windows tanpa menggunakan tanda kutip? "
barlop
2
@barlop Tentu, tetapi alasan untuk tidak ada tanda kutip adalah bahwa tanda bintang tidak melakukan tugasnya ketika itu di dalam tanda kutip. Solusi yang saya berikan menghindari masalah ini karena tanda bintang berada di luar tanda kutip. Jawaban ini tidak mematuhi surat pertanyaan, tetapi mematuhi semangat pertanyaan (yaitu, ia bekerja untuk tujuan yang dimaksudkan).
Kit Johnson
26

Terlepas dari jawaban yang memberikan ilusi bahwa itu berhasil, faktanya adalah Anda tidak dapat menyelinap di ruang ke dalam argumen cmd biasa. Ini mudah dibuktikan:

  1. Simpan " echo %1" sebagai test.bat. File batch ini akan menampilkan argumen pertama yang cmd melewati kita.

  2. Sekarang, coba dan jalankan test.bat, tetapkan nilai %1untuk foo bar. (Perhatikan bahwa ada spasi antara foodan bar.)

  3. Coba-coba selama beberapa tahun dan sadari bahwa tidak ada cara untuk melakukannya . Orang-orang akan menyarankan untuk melarikan diri menggunakan ^, namun test.bat foo^ bartidak akan menghasilkan foo bar.

Jadi, tidak ada cara untuk mendapatkan output foo bar, dan yang terdekat yang bisa kita dapatkan adalah menjalankan test.bat foo" "baryang menghasilkan foo" "bar, atau menjalankan test.bat "foo bar"yang menghasilkan "foo bar".


Sekarang, alasan jawaban yang lain muncul untuk bekerja adalah karena cdtidak itu sendiri parsing tambahan, menyimpang dari perilaku argumen yang biasa melewati (biasa %1, %2, %3dan lain-lain dalam batch file khas).

Misalnya, perhatikan perintah khusus:

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

Mengapa ini berhasil? Ini karena ia cd sendiri melakukan sesuatu yang setara dengan menggabungkan 7 argumen biasa menjadi satu argumen logis. Menurut cmd argumen yang melewati norma, kita melihat 7 argumen:

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

Seolah-olah cdtelah menggabungkan semua 7 argumen menjadi satu yang logis, melakukan sesuatu yang mirip array.join(" "), yang menghasilkan jalan:

c:\documents and settings \some folder with spaces

Perhatikan bahwa perilaku ini khusus untuk cdhanya (dan beberapa fungsi lainnya). Ini tidak ada hubungannya dengan berlalunya argumen.


Memang, cdmemiliki kekhasan lain. Ingat kami menyatakan di atas bahwa kami tidak bisa mendapatkan output foo bar? Output terdekat yang bisa kita dapatkan adalah dengan menjalankan:

test.bat foo" "bar

yang menghasilkan foo" "bar, atau:

test.bat "foo bar"

yang menghasilkan "foo bar", atau:

test.bat "foo "bar

yang menghasilkan "foo "bar, atau:

test.bat foo" bar"

yang menghasilkan foo" bar", atau:

test.bat "foo b"ar

yang menghasilkan "foo b"ar, atau:

test.bat fo"o bar"

yang menghasilkan fo"o bar", atau:

test.bat fo"o ba"r

yang menghasilkan fo"o ba"r, atau:

test.bat "fo"o" bar"

yang menghasilkan "fo"o" bar", atau:

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

yang menghasilkan "f""o""o"" ""b""a""r", atau bahkan:

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

yang menghasilkan """"f"""o""""o"" ""ba"""r"""""""""".

Semua contoh di atas memiliki satu kesamaan, yang akan mereka hasilkan foo barsetelah kita memotong "karakter. cdPenulis pasti menyadari hal ini juga ... jika kita menyimpulkan dari cdperilaku aneh yang memotong semua "yang diterimanya , memungkinkan semua perintah ini bekerja:

  • 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

Pacerier
sumber
15
Betapa kacau windows batch programming ...
Klangen
Terima kasih. Bisakah kita menentukan apakah CD menggunakan argv[]atau GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

Nama-nama pendek tampak bekerja seperti angin.

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

Untuk meningkatkan memori ..;)

Milorulez
sumber
8
itu mungkin tidak berfungsi jika nama file pendek telah dinonaktifkan
phuclv
3

Gunakan nama file 8.3 pendek. Sebagai contoh:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
sumber
Lihat komentar Lưu Vĩnh Phúc untuk jawaban Milorulez .
Gerold Broser
2

Bagi mereka yang berbicara tentang penggantian 8.3, harap perhatikan dua hal berikut:

  • 8.3 dapat diatur ke dinonaktifkan (atau diaktifkan) pada NTFS, sehingga mungkin tidak selalu ada.
  • Nama 8.3 file / folder dapat berubah tanpa pemberitahuan hanya dengan membuat, mengganti nama, atau menghapus hal-hal lain di folder yang sama.

Jadi c:\docume~1bisa menunjuk ke:

  • Tidak ada tempat (tidak valid)
  • Folder yang Anda inginkan
  • Folder lain
  • Folder variabel sepanjang waktu

Itu tidak aman, kecuali Anda mendapatkan nama pendek dan menggunakannya dalam operasi atom.

Meskipun sangat jarang mereka berubah, adalah umum bahwa mereka tidak ada.

Jika Anda ingin tahu apakah 8.3 ada untuk folder / file tertentu, uji dengan parameter /Xpada dirperintah, atau enkapsulasi pada forhanya untuk mendapatkan bagian itu, dll.

Untuk selengkapnya tentang cara mengaktifkan / menonaktifkan 8.3 pada NTFS, lihat artikel dukungan Microsoft ini:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- partisi-penciptaan-ntfs

Claudio
sumber
0

Menindaklanjuti pos @ Pang, dan yang lainnya membahas nama pendek dan jebakan, inilah cara untuk secara dinamis menyelesaikan nama panjang menjadi nama pendek:

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

Kemudian, jelas Anda bisa menggunakan nama pendek daripada tanda kutip di sekitarnya.

Terima kasih
sumber