Bagaimana perintah Windows RENAME (REN) mengartikan wildcard?
Fasilitas BANTUAN bawaan tidak membantu - tidak menangani wildcard sama sekali.
The Microsoft TechNet XP bantuan online tidak jauh lebih baik. Inilah yang bisa dikatakan tentang wildcard:
"Anda dapat menggunakan wildcard (
*
dan?
) di salah satu parameter nama file. Jika Anda menggunakan wildcard di nama file2, karakter yang diwakili oleh wildcard akan identik dengan karakter terkait di namafile1."
Tidak banyak membantu - ada banyak cara pernyataan itu dapat diinterpretasikan.
Saya telah berhasil menggunakan wildcard dalam parameter filename2 pada beberapa kesempatan, tetapi selalu ada trial and error. Saya belum dapat mengantisipasi apa yang berhasil dan yang tidak. Seringkali saya harus menggunakan skrip batch kecil dengan loop FOR yang mem-parsing setiap nama sehingga saya dapat membangun setiap nama baru sesuai kebutuhan. Sangat tidak nyaman.
Jika saya tahu aturan untuk bagaimana wildcard diproses maka saya pikir saya bisa menggunakan perintah RENAME lebih efektif tanpa harus menggunakan batch sesering mungkin. Tentu saja mengetahui aturan juga akan menguntungkan pengembangan batch.
(Ya - ini adalah kasus di mana saya memposting pertanyaan dan jawaban berpasangan. Saya bosan tidak mengetahui aturan dan memutuskan untuk bereksperimen sendiri. Saya pikir banyak orang lain mungkin tertarik pada apa yang saya temukan)
sumber
*
, Windows tidak. Itu memiliki konsekuensi besar. Saya berharap saya tahu tentang situs itu; mungkin membuat penyelidikan saya lebih mudah. Aturan MSDOS7 sangat berbeda dari aturan DOS lama sebelum nama file lama, dan mereka adalah langkah ke arah bagaimana Windows menanganinya. Saya telah menemukan aturan nama file DOS nama lama, dan mereka tidak berharga untuk penyelidikan saya.Jawaban:
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 ditambahkanc
ke nama target. (Mengganti karakter dengan sumberc
, 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 terakhirc
(pertandingan serakah yang peka terhadap huruf besar-kecil) dan menambahkan rangkaian karakter yang cocok ke nama target. Jikac
tidak ditemukan, maka semua karakter yang tersisa dari sumber ditambahkan, diikuti olehc
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)
Ubah ekstensi (final) dari setiap file
Tambahkan ekstensi ke setiap file
Hapus ekstensi tambahan apa pun setelah ekstensi awal. Perhatikan bahwa memadai
?
harus digunakan untuk mempertahankan nama lengkap yang ada dan ekstensi awal.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)Ubah karakter setelah
_
nama terakhir dan coba pertahankan ekstensi. (Tidak berfungsi dengan baik jika_
muncul dalam ekstensi)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.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.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.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
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:
Saya percaya sourceMask
*1*
pertama kali cocok dengan nama file yang panjang, dan file tersebut diubah namanya menjadi hasil yang diharapkan223456789.123.x
. RENAME kemudian terus mencari lebih banyak file untuk diproses dan menemukan file yang baru dinamai melalui nama pendek baru223456~1.X
. File tersebut kemudian diganti lagi memberikan hasil akhir dari223456789.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.
sumber
REN /?
.Copy of
awalan menggunakan teknik garis miring yang tidak jelas:ren "Copy of *.txt" "////////*"
Mirip dengan exebook, inilah implementasi C # untuk mendapatkan nama file target dari sourcefile.
Saya menemukan 1 kesalahan kecil dalam contoh dbenham:
Ini kodenya:
Dan inilah metode pengujian NUnit untuk menguji contoh:
sumber
Mungkin seseorang dapat menemukan ini berguna. Kode JavaScript ini didasarkan pada jawaban oleh dbenham di atas.
Saya tidak
sourceMask
banyak menguji , tetapitargetMask
cocok dengan semua contoh yang diberikan oleh dbenham.sumber
Saya telah berhasil menulis kode ini dalam BASIC untuk menutupi nama file wildcard:
sumber