Di Windows Explorer, mengapa kita bisa membuat folder atau file dengan simbol persen (%), jika simbol persen digunakan untuk variabel yang ada?

13
  1. Pergi ke Windows Explorer, dan membuat folder / direktori bernama %systemdrive%, %windir%atau variabel lain yang sudah ada.
  2. Buka prompt perintah, dan buka folder yang baru saja Anda buat.

Anda tidak bisa, karena ada %simbol persen ( ) di nama folder, membingungkan prompt perintah, karena simbol persen digunakan untuk variabel yang ada.

Melepaskan %simbol persen ( ) dengan simbol dua persen ( %%) tidak berfungsi, jadi jawaban DavidPostill salah:

Jendela prompt perintah, dengan sedikit tampilan desktop Explorer Jadi, di Windows Explorer, mengapa kita bisa membuat folder atau file dengan %simbol persen ( ), jika simbol persen digunakan untuk variabel yang ada?

The Tech Guy
sumber

Jawaban:

16

Mengapa kita bisa membuat folder / file dengan simbol persen?

The %karakter bukan karakter dicadangkan dalam nama file.

Karakter yang disediakan untuk penamaan file, jalur, dan ruang nama adalah:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Sumber Memberi Nama File, Jalur, dan Ruang Nama


Simbol persen dicadangkan untuk variabel

Sekarang, buka prompt perintah dan coba buka folder yang Anda buat.

Anda tidak bisa, karena ada simbol persen dalam nama folder, yang menunjukkan bahwa itu adalah variabel.

Di atas tidak benar. Semuanya berfungsi seperti yang Anda harapkan.

Contoh menggunakan %test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Contoh menggunakan %systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

Lolos Persen

The %karakter memiliki arti khusus untuk parameter baris perintah dan FORparameter.

Untuk memperlakukan persen sebagai karakter biasa, gandakan:

%%

Sintaksis sumber


Bacaan lebih lanjut

DavidPostill
sumber
1
Catatan: tidak semua karakter yang dipesan berlaku untuk sistem file NTFS. Menggunakan Linux, misalnya, saya dapat dengan mudah membuat file bernama <test>. Ini tidak bisa dilakukan dengan menggunakan fungsi manajemen file Windows.
Nathan Osman
2
@NathanOsman Anda mungkin dapat membuat file dengan nama-nama itu dari dalam Windows menggunakan notasi path absolut mentah ( \\?\C:\USERS\DEFAULT\<test>).
zwol
@ zwol oh? Saya tidak tahu itu. Senang mendengarnya.
Nathan Osman
@ zwol Bukan dari cmdshell ... F:\test>md \\?\f:\test\<test> Sintaks perintahnya salah.
DavidPostill
@ DavidPostill Bagaimana md \\^?\f:\test\^<test^>?
zwol
11

Jawaban DavidPostill sangat bagus, tetapi mungkin sedikit membingungkan pendatang baru. Saya akan coba ulangi.

%bukan karakter yang dilindungi undang - undang .

Ini adalah karakter dengan arti khusus untuk shell command (alias cmd.exedan command.com)

Perbedaannya adalah:

  • Anda tidak dapat menggunakan karakter yang dipesan sama sekali (tetapi lihat di bawah)
  • Anda mungkin dapat menggunakan karakter khusus dan melarikan diri - hanya dengan tidak mengetiknya apa adanya

Dengan kata lain, Anda dapat membuat file atau folder yang berisi %namanya. Anda dapat melakukannya secara langsung menggunakan windows explorer karena %tidak memiliki makna khusus di sana. Tidak ada niat untuk mencegah Anda membuat file seperti itu di command prompt juga, tetapi karena %memiliki makna khusus di sana, Anda perlu menggunakan sintaks yang diuraikan di bawah ini untuk membuat file seperti itu.

BAT-file

Jika Anda menulis file batch (* .bat, * .cmd), yang dieksekusi oleh shell perintah (alias aplikasi prompt perintah), untuk menggunakan %secara harfiah (seperti untuk membuat file dengan %nama, dan bukan untuk menggantikan variabel atau parameter) Anda harus mengetik %%.

Sebagai contoh,

  • perintah echo %windir%menghasilkan output:c:\windows
  • Namun, perintah echo %%windir%%menghasilkan keluaran:%windir%
  • dan seterusnya: perintah echo %%%%windir%%%%menghasilkan output:%%windir%%

Jadi jika Anda menyimpan baris berikut sebagai test.batdan menjalankannya, itu akan membuat direktori bernama %test%lengkap dengan tanda persen:

md %%test%%

Jika tidak ada variabel bernama test, perintah berikut ini setara dengan yang terakhir - itu juga membuat direktori %test%:

md %test%

... tapi tolong jangan pernah melakukannya seperti itu karena perintah Anda tidak akan berperilaku seperti yang Anda inginkan begitu seseorang membuat variabel dengan nama itu

Jika Anda berniat untuk menggunakan perintah fordalam file BAT, Anda juga harus menggandakan %sehingga forperintah itu memiliki arti khusus untuk alih-alih untuk shell perintah itu sendiri:

for %%i in (*.*) do echo %%i

Ini akan menghasilkan daftar file dalam direktori saat ini (yaitu, %%imemiliki arti khusus), dan saya tidak yakin bagaimana membuatnya menghasilkan literal %%itanpa menggunakan %p%solusi yang dijelaskan di bagian selanjutnya ( %%%%itidak berfungsi di sini).

%bukan satu-satunya karakter dengan makna khusus pada command prompt. Lainnya termasuk ^, <, >, |, (, ), &, !, ". Sebagian besar dari mereka (tidak termasuk ") dapat melarikan diri - yaitu, diawali dengan karakter pelolosan ^sehingga karakter literal dimasukkan, menekan makna khusus. Mereka juga kehilangan fungsi khusus mereka dalam string doublequoted, dan "yang lolos dengan garis miring terbalik: \". Beberapa caret ( ^) mungkin perlu digandakan di dalam string doublequote-tertutup dan di mana terjadi substitusi variabel tertunda ( !arti khusus).

Command prompt

Sayangnya, ketika mengetik perintah ke jendela command prompt secara langsung, menggandakan %karakter hanya menghasilkan %%yaitu pendekatan di atas tidak berfungsi dalam kasus itu.

Tampaknya ada solusi memanfaatkan kekhasan dalam pemrosesan perintah - Anda bisa mendapatkan literal %dengan mengetik ^setelahnya %. Pendekatan itu bukan sangat mudah: jika nama file Anda dilampirkan dalam tanda kutip ganda, ^diartikan secara harfiah (dan tidak dihapus seperti tanpa tanda kutip)

  • perintah echo %windir%menghasilkan output:c:\windows
  • perintah echo %^windir%menghasilkan output:%windir%
  • perintah echo "%^windir%"menghasilkan output: "%^windir%"(dengan tambahan ^- bukan apa yang kita inginkan)

Saya merekomendasikan solusi lain sebagai gantinya:

  • buat variabel seperti ini: set "p=%"
  • gunakan %p%dimanapun Anda membutuhkan tanda persen literal: echo "%p%windir%p%"sekarang akan menghasilkan keluaran:"%windir%"

Solusi yang sama dapat digunakan untuk mendapatkan forperintah masuk persen secara literal , namun perhatikan bahwa tidak seperti file BAT saat mengetik forperintah secara langsung, Anda tidak menggandakan tanda persen.

Karakter sistem file yang dilindungi undang-undang

Anda biasanya tidak dapat membuat file atau direktori yang berisi karakter-karakter khusus berikut dalam namanya / ? < > \ : * | ":, NULL-simbol dan karakter dengan kode 1 hingga 31; juga .dan spasi tidak bisa menjadi karakter terakhir; dan nama berikut adalah ilegal: com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.

Namun, beberapa dari pembatasan ini dapat dilewati awalan path file dengan \\?\seperti ini: \\?\c:\test...\nul. Setidaknya file dengan nama yang dicadangkan dan yang diakhiri dengan spasi dan titik dapat dimanipulasi seperti itu.

Terlebih lagi, sistem file NTFS sendiri mendukung beberapa subsistem penamaan: DOS, Windows dan POSIX. Ini adalah subsistem Windows yang memiliki semua batasan di atas, sementara POSIX hanya melarang /dan simbol NULL.

GNU / Linux OS (superset dari POSIX) dengan demikian dapat membuat (dan menghapus) nama-nama file / direktori yang fungsi windows API paling normal (dan karenanya program windows) tidak dapat bekerja dengan. Pada Windows XP bekerja dengan mereka dimungkinkan dengan menginstal "Layanan Untuk Unix subsistem" (SFU) gratis; pada Vista dan di atas alat pihak ketiga diperlukan untuk itu. Saya tidak yakin apakah subsistem ubuntu-on-windows10 baru dapat melakukannya.

Jack White
sumber
Mengapa Anda menggunakan tag keyboard untuk nama jalur / perintah? Secara sintaksis akan lebih benar dan lebih mudah dibaca jika Anda hanya menggunakan pemformatan kode inline. Ini juga akan lebih mudah untuk mengetik: backtick daripada <kbd>.
Cody Grey
selesai Saya pikir tag <kbd> </kbd> memiliki garis besar yang lebih jelas daripada code blocks. Tetapi jika pertanyaan seperti itu muncul, saya kira mereka memang menyebabkan kebingungan.
Jack White
2
"Ini adalah simbol pelarian dari shell perintah" Tidak benar. Karakter melarikan diri dalam cmd adalah ^. %adalah "karakter yang memiliki arti khusus untuk parameter baris perintah dan parameter UNTUK. Untuk memperlakukan persen sebagai karakter biasa, gandakan saja".
DavidPostill
Memang, persyaratan saya campur aduk. Sekarang dikoreksi jawabannya. Terima kasih.
Jack White
Juga menyenangkan catatan, seperti diuraikan dalam jawaban saya, Anda hanya ganda %di forjika itu foradalah di dalam file batch. Mengetik for %%i in (*) do echo %%ike jendela perintah propmt menghasilkan kesalahan mengutip penampilan yang tidak tepat %%i.
Jack White