Aturan-aturan ini ditemukan setelah pengujian ekstensif pada mesin Vista. Tidak ada tes yang dilakukan dengan unicode dalam nama file.
RENAME membutuhkan 2 parameter - sourceMask, diikuti oleh targetMask. SourceMask dan targetMask dapat berisi *
dan / atau ?
wildcard. Perilaku wildcard sedikit berubah antara masker sumber dan target.
Catatan - REN dapat digunakan untuk mengganti nama folder, tetapi wildcard tidak diperbolehkan di sourceMask atau targetMask saat mengganti nama folder. Jika sourceMask cocok dengan setidaknya satu file, maka file tersebut akan diganti namanya dan folder akan diabaikan. Jika sourceMask hanya cocok dengan folder dan bukan file, maka kesalahan sintaksis dihasilkan jika wildcard muncul di sumber atau target. Jika sourceMask tidak cocok dengan apa pun, maka hasil kesalahan "file tidak ditemukan".
Juga, ketika mengganti nama file, wildcard hanya diperbolehkan di bagian nama file dari sourceMask. Wildcard tidak diperbolehkan di jalur yang mengarah ke nama file.
sourceMask
SourceMask berfungsi sebagai filter untuk menentukan file mana yang diganti namanya. Wildcard bekerja di sini sama dengan perintah lain yang memfilter nama file.
?
- Cocok dengan 0 atau 1 karakter apa pun kecuali .
wildcard ini rakus - selalu mengkonsumsi karakter berikutnya jika bukan karakter .
Namun tidak akan cocok dengan apa pun tanpa kegagalan jika di akhir nama atau jika karakter berikutnya adalah.
*
- Cocok dengan 0 karakter atau lebih termasuk .
(dengan satu pengecualian di bawah). Kartu liar ini tidak serakah. Itu akan cocok sesedikit atau sebanyak yang diperlukan untuk memungkinkan karakter berikutnya untuk cocok.
Semua karakter non-wildcard harus cocok dengan diri mereka sendiri, dengan beberapa pengecualian kasus khusus.
.
- Cocokkan sendiri atau dapat cocok dengan akhir nama (tidak ada) jika tidak ada lagi karakter yang tersisa. (Catatan - nama Windows yang valid tidak dapat diakhiri dengan .
)
{space}
- Cocokkan sendiri atau dapat cocok dengan akhir nama (tidak ada) jika tidak ada lagi karakter yang tersisa. (Catatan - nama Windows yang valid tidak dapat diakhiri dengan {space}
)
*.
pada akhirnya - Mencocokkan 0 karakter atau lebih kecuali .
Pengakhiran .
sebenarnya dapat berupa kombinasi .
dan {space}
selama karakter terakhir dalam mask adalah .
Ini adalah satu-satunya pengecualian di mana *
tidak hanya cocok dengan set karakter apa pun.
Aturan di atas tidak serumit itu. Tetapi ada satu lagi aturan yang sangat penting yang membuat situasi membingungkan: SourceMask dibandingkan dengan nama panjang dan nama pendek 8.3 (jika ada). Aturan terakhir ini dapat membuat interpretasi hasil sangat rumit, karena tidak selalu jelas ketika topeng dicocokkan melalui nama pendek.
Dimungkinkan untuk menggunakan RegEdit untuk menonaktifkan pembuatan nama-nama pendek 8.3 pada volume NTFS, di mana titik interpretasi hasil mask file jauh lebih mudah. Setiap nama pendek yang dibuat sebelum menonaktifkan nama pendek akan tetap ada.
targetMask
Catatan - Saya belum melakukan pengujian yang ketat, tetapi tampaknya aturan yang sama ini juga berfungsi untuk nama target dari perintah COPY
TargetMask menentukan nama baru. Itu selalu diterapkan pada nama panjang penuh; TargetMask tidak pernah diterapkan ke nama 8.3 pendek, bahkan jika sourceMask cocok dengan nama 8.3 pendek.
Ada atau tidaknya wildcard di sourceMask tidak berdampak pada bagaimana wildcard diproses di targetMask.
Dalam diskusi berikut - c
mewakili karakter apapun yang tidak *
, ?
atau.
TargetMask diproses berdasarkan nama sumber ketat dari kiri ke kanan tanpa pelacakan-kembali.
c
- Meningkatkan posisi dalam nama sumber selama karakter berikutnya tidak .
dan ditambahkan c
ke nama target. (Mengganti karakter dengan sumber c
, tetapi tidak pernah menggantikan .
)
?
- Cocokkan karakter berikutnya dari nama panjang sumber dan menambahkannya ke nama target selama karakter berikutnya tidak .
Jika karakter berikutnya adalah .
atau jika pada akhir nama sumber maka tidak ada karakter yang ditambahkan ke hasil dan saat ini posisi dalam nama sumber tidak berubah.
*
di akhir targetMask - Menambahkan semua karakter yang tersisa dari sumber ke target. Jika sudah di akhir sumber, maka tidak melakukan apa-apa.
*c
- Mencocokkan semua karakter sumber dari posisi saat ini melalui kejadian terakhir c
(pertandingan serakah yang peka terhadap huruf besar-kecil) dan menambahkan rangkaian karakter yang cocok ke nama target. Jika c
tidak ditemukan, maka semua karakter yang tersisa dari sumber ditambahkan, diikuti oleh c
Ini adalah satu-satunya situasi yang saya tahu di mana pencocokan pola file Windows sensitif huruf.
*.
- Mencocokkan semua karakter sumber dari posisi saat ini melalui kejadian terakhir.
(pertandingan serakah) dan menambahkan set karakter yang cocok ke nama target. Jika .
tidak ditemukan, maka semua karakter yang tersisa dari sumber ditambahkan, diikuti oleh.
*?
- Menambahkan semua karakter yang tersisa dari sumber ke target. Jika sudah di akhir sumber maka tidak melakukan apa-apa.
.
without *
in front - Meningkatkan posisi dalam sumber melalui kejadian pertama.
tanpa menyalin karakter apa pun, dan menambahkan .
ke nama target. Jika .
tidak ditemukan dalam sumber, maka maju ke akhir sumber dan tambahkan .
ke nama target.
Setelah targetMask telah habis, semua yang tertinggal .
dan {space}
dipangkas dari akhir nama target yang dihasilkan karena nama file Windows tidak dapat diakhiri dengan .
atau{space}
Beberapa contoh praktis
Ganti karakter di posisi 1 dan 3 sebelum ekstensi apa pun (tambahkan karakter 2 atau 3 jika belum ada)
ren * A?Z*
1 -> AZ
12 -> A2Z
1.txt -> AZ.txt
12.txt -> A2Z.txt
123 -> A2Z
123.txt -> A2Z.txt
1234 -> A2Z4
1234.txt -> A2Z4.txt
Ubah ekstensi (final) dari setiap file
ren * *.txt
a -> a.txt
b.dat -> b.txt
c.x.y -> c.x.txt
Tambahkan ekstensi ke setiap file
ren * *?.bak
a -> a.bak
b.dat -> b.dat.bak
c.x.y -> c.x.y.bak
Hapus ekstensi tambahan apa pun setelah ekstensi awal. Perhatikan bahwa memadai ?
harus digunakan untuk mempertahankan nama lengkap yang ada dan ekstensi awal.
ren * ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 -> 12345.12345 (note truncated name and extension because not enough `?` were used)
Sama seperti di atas, tetapi saring file dengan nama awal dan / atau ekstensi lebih dari 5 karakter sehingga tidak terpotong. (Jelas bisa menambahkan tambahan ?
di salah satu ujung targetMask untuk mempertahankan nama dan ekstensi hingga 6 karakter)
ren ?????.?????.* ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 (Not renamed because doesn't match sourceMask)
Ubah karakter setelah _
nama terakhir dan coba pertahankan ekstensi. (Tidak berfungsi dengan baik jika _
muncul dalam ekstensi)
ren *_* *_NEW.*
abcd_12345.txt -> abcd_NEW.txt
abc_newt_1.dat -> abc_newt_NEW.dat
abcdef.jpg (Not renamed because doesn't match sourceMask)
abcd_123.a_b -> abcd_123.a_NEW (not desired, but no simple RENAME form will work in this case)
Nama apa pun dapat dipecah menjadi komponen yang dibatasi oleh .
Karakter hanya dapat ditambahkan atau dihapus dari akhir setiap komponen. Karakter tidak dapat dihapus dari atau ditambahkan ke awal atau tengah komponen sambil mempertahankan sisanya dengan wildcard. Pergantian diperbolehkan di mana saja.
ren ??????.??????.?????? ?x.????999.*rForTheCourse
part1.part2 -> px.part999.rForTheCourse
part1.part2.part3 -> px.part999.parForTheCourse
part1.part2.part3.part4 (Not renamed because doesn't match sourceMask)
a.b.c -> ax.b999.crForTheCourse
a.b.CarPart3BEER -> ax.b999.CarParForTheCourse
Jika nama pendek diaktifkan, maka sourceMask dengan setidaknya 8 ?
untuk nama dan setidaknya 3 ?
untuk ekstensi akan cocok dengan semua file karena akan selalu cocok dengan nama pendek 8.3.
ren ????????.??? ?x.????999.*rForTheCourse
part1.part2.part3.part4 -> px.part999.part3.parForTheCourse
Keunikan / bug yang berguna? untuk menghapus awalan nama
Posting SuperUser ini menjelaskan bagaimana satu set garis miring ( /
) dapat digunakan untuk menghapus karakter utama dari nama file. Diperlukan satu tebasan untuk setiap karakter yang akan dihapus. Saya telah mengkonfirmasi perilaku di mesin Windows 10.
ren "abc-*.txt" "////*.txt"
abc-123.txt --> 123.txt
abc-HelloWorld.txt --> HelloWorld.txt
Teknik ini hanya berfungsi jika topeng sumber dan target dilampirkan dalam tanda kutip ganda. Semua formulir berikut tanpa tanda kutip yang diperlukan gagal dengan kesalahan ini:The syntax of the command is incorrect
REM - All of these forms fail with a syntax error.
ren abc-*.txt "////*.txt"
ren "abc-*.txt" ////*.txt
ren abc-*.txt ////*.txt
Tidak /
dapat digunakan untuk menghapus karakter apa pun di tengah atau akhir nama file. Itu hanya dapat menghapus karakter utama (awalan).
Secara teknis /
tidak berfungsi sebagai wildcard. Alih-alih melakukan substitusi karakter sederhana, tetapi kemudian setelah substitusi, perintah REN mengakui bahwa /
tidak valid dalam nama file, dan menghapus /
garis miring dari namanya. REN memberikan kesalahan sintaks jika mendeteksi /
di tengah nama target.
Kemungkinan bug RENAME - satu perintah dapat mengganti nama file yang sama dua kali!
Mulai di folder tes kosong:
C:\test>copy nul 123456789.123
1 file(s) copied.
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 123456~1.123 123456789.123
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
C:\test>ren *1* 2*3.?x
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 223456~1.XX 223456789.123.xx
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
REM Expected result = 223456789.123.x
Saya percaya sourceMask *1*
pertama kali cocok dengan nama file yang panjang, dan file tersebut diubah namanya menjadi hasil yang diharapkan 223456789.123.x
. RENAME kemudian terus mencari lebih banyak file untuk diproses dan menemukan file yang baru dinamai melalui nama pendek baru 223456~1.X
. File tersebut kemudian diganti lagi memberikan hasil akhir dari 223456789.123.xx
.
Jika saya menonaktifkan generasi nama 8,3 maka RENAME memberikan hasil yang diharapkan.
Saya belum sepenuhnya menyelesaikan semua kondisi pemicu yang harus ada untuk memicu perilaku aneh ini. Saya khawatir bahwa mungkin saja membuat RENAME rekursif yang tidak pernah berakhir, tetapi saya tidak pernah bisa memunculkannya.
Saya percaya semua hal berikut harus benar untuk menginduksi bug. Setiap kasing yang saya lihat memiliki kondisi berikut, tetapi tidak semua kasing yang memenuhi ketentuan berikut disadap.
- Nama 8,3 pendek harus diaktifkan
- SourceMask harus cocok dengan nama panjang asli.
- Ganti nama awal harus menghasilkan nama pendek yang juga cocok dengan sourceMask
- Nama pendek berganti nama awal harus diurutkan lebih lambat dari nama pendek asli (jika ada?)