Kadang-kadang, ketidakmampuan shell CMD untuk memperluas jalur wildcard benar-benar bisa menjadi ketidaknyamanan. Saya harus melewatkan 100 file dalam direktori ke program, dan tidak bisa mengetik * .ext. Sebagai gantinya, saya menggunakan 'ls' mingw untuk membuang daftar ke file, kemudian mengganti baris baru dengan spasi, disalin dan disisipkan ke cmd. Cukup mimpi buruk.
Saya curiga jawabannya adalah tidak, tetapi adakah yang sudah menangani ini atau mencari cara untuk membuatnya lebih mudah?
windows-7
command-line
wildcards
batch
mencemari
sumber
sumber
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
Sebenarnya, saya memiliki masalah yang berlawanan, saya mencoba mencari cara untuk membuat penerjemah perintah memperlakukan daftar sebagai string dan mencegahnya tidak menginstruksikan mereka sebagai wildcard. Sebagai contoh,for %i in (foobar baz really?) do @echo %i
akan memperlakukan item terakhir (really?
) sebagai wildcard nama file, dan lewatkan saja jika tidak ada file bernamareally1
,reallyz
, dll ☹?
bukan karakter hukum untuk nama file di sistem file Windows. Karakter hanya dapat diartikan sebagai wildcard. Lihat Menamai File, Paths, dan Namespaces di MSDN dan Menggunakan karakter wildcard di TechNet.Jawaban:
DOS, dan akibatnya Windows
cmd.exe
, tidak pernah mendukung ekspansi wildcard oleh shell. Selalu tergantung pada aplikasi untuk melakukan ekspansi.Ini berarti Anda akan selalu harus menemukan rute lain jika Anda menggunakan aplikasi yang tidak mendukung ekspansi. Anda bisa:
dir /b > list.txt
untuk menggunakandir
perintah untuk melakukan ekspansi dan meletakkan daftar file ke file teks (Anda kemudian bisa menggunakan sesuatu seperti rumus Excel jika Anda benar-benar putus asa untuk menghasilkan daftar perintah untuk ditempelkan ke dalamcmd
, atau Anda bisa menggunakan Excel untuk mengubah urutan sel sehingga semua nama file berada pada baris yang sama.)sumber
Cukup gunakan Powershell, yang sudah diinstal pada Windows 7. Powershell mampu menjalankan perintah cmd dan mengerti wildcard di setiap tempat di jalan.
Untuk memulai Powershell cukup ketik "PowerShell" di kotak pencarian menu mulai dan tekan enter.
Jika aplikasi mengharapkan string dengan semua nama file di dalamnya, ini adalah skrip yang tepat:
Ubah
$delimiter = " "
ke$delimiter = ","
jika aplikasi Anda mengharapkan daftar nama file yang dipisahkan koma.Penjelasan kode:
[string]$files = $nothing
- Membuat variabel tipe kosongstring
;
- adalah pemisah untuk banyak perintah, bukan saluran pipa!ls *.txt | % { $files += $_.fullname + $delimiter }
- Mendapat daftar semua file teks dan membuat string dengan semua nama file yang dipisahkan oleh pembatasapplication.exe $files
- memanggil aplikasi dan meneruskan daftar file ke sanaAnda bahkan dapat mencari pola berkas secara rekursif dengan menambahkan
-recurse
kels *.txt
sehingga kode lengkap akan terlihat seperti ini:Sunting:
Untuk menghindari iritasi,
ls
dandir
aliasGet-ChildItem
atau%
merupakan alias untukForEach-Object
. Saya menyimpan kode saya dengan alias yang digunakan karena lebih pendek.EDIT 2018/04/25:
Kembali pada tahun 2012, saya sudah cukup baru di PowerShell. Tentu saja ada cara yang lebih mudah meskipun tidak semudah kemampuan ekspansi glob unix / linux:
app.exe $(ls *.txt | % {$_.FullName})
Penjelasan:
ls *.txt
mendapat objek FileInfo dari semua file yang cocok dengan glob*.txt
% { $_.FileName }
melakukan itu untuk kita.%
loop atas semua elemen yang dikembalikan olehls
dan menampilkan setiap objek FileName.sumber
start notepad++ *.txt
(dengan maksud untuk membuka semua textfiles - notepad digunakan ++ seperti halnya menangani beberapa nama) akan mendapatkan tempatdir *.txt | % { notepad++.exe $_ }
. Saya mencobanya dengan notepad sederhana, karena saya tidak punya notepad ++, dan itu berhasil. Perintah menerima daftar semua file txt di direktori saat ini, meneruskan daftar ke perintah berikutnya yang melewati daftar dan mengeksekusi notepad ++ dengan nama file sebagai parameter.grep "a b c"
untuk menemukan salah satu string yang terdaftar, di mana "ab c" akan diperluas daftarcopy a+b+c result
dancopy a result
copy b result
copy c result
. (dan grep seperti utilitas memang ada di PS, itu disebutselect-string
)Ini akan memberi Anda daftar dan juga memasukkannya ke dalam variabel bernama
expanded_list
. Masukkan ke dalam file batch dan jalankanmyBatchFile name myPattern
. Lampirkan pola dengan tanda kutip jika termasuk spasi. Cocokkan file, tanpa dir. Jalankan tanpa parameter cocok dengan semua.Anda kemudian dapat menjalankan perintah Anda dengan
my_command_exec %expanded_list%
PERINGATAN! Ukuran maksimum variabel cmd adalah 8191 karakter (XP dan seterusnya), jadi mungkin saja untuk melimpah! Anda tidak dapat mengandalkan utilitas untuk selalu memberi Anda daftar lengkap. Di sisi lain, panjang garis cmd maksimum juga 8191 sehingga Anda tidak akan bisa menjalankannya.
sumber
Ini berfungsi di cmd.exe
atau
sumber
dir /b TortoiseSVN\bin\sv*.exe
akan ditampilkansvn.exe
dansvnadmin.exe
. Tetapidir /b TortoiseSVN\bi*\svn.exe
menunjukkan kesalahan sintaksis.dir /s /b
. Ini memberi Anda jalan penuh.Catatan, ini ada di Komentar untuk poster di utas terpisah user619818 dan tembus)
DIR dapat dan memang memungkinkan mencari semua subdirektori untuk file yang cocok dengan jenis tertentu.
Catatan: Direktori Root untuk memeriksa di mana semua subdirektori berada di bawah diasumsikan "C: \ My Program \ Root \" karena penulis tidak memberikan nama jalur di mana direktori ini berada
ini akan memberikan path file lengkap dan nama file dari file sumber.
jika Anda hanya ingin nama file, Anda harus melakukan sebagai berikut
jadi dengan asumsi Anda ingin memindahkan semua file ini dari "C: \ My Program \ Root \ Sub Directories \ *. ext" ke "D: \ Singlefolder \ *. ext" Anda cukup melakukan ini:
Harapan yang membantu orang lain di masa depan. :)
sumber
Ini sudah tua, tetapi dengan subsistem Linux untuk windows, cukup umum untuk memiliki bash di PATH Anda sekarang. Jika itu masalahnya, maka ini mungkin melakukan trik untuk Anda:
sumber