Joker karakter yollarını genişletmek için windows cmd kabuğunu elde etmenin bir yolu var mı?


37

Bazen, cmd kabuğunun joker karakter yollarını genişletememesi gerçekten rahatsız edici olabilir. Bir dizindeki 100 dosyayı bir programa aktarmak zorunda kaldım ve * .ext yazamadım. Bunun yerine, listeyi bir dosyaya dökmek için mingw's 'ls' kullandım, sonra yeni satırları boşluklarla değiştirdim, kopyalayıp cmd'ye yapıştırdım. Oldukça kabus.

Cevabın hayır olacağından şüpheliyim, ancak bunu çözen ya da bunu kolaylaştıracak herhangi bir yolla gelen var mı?


2
Bunun yerine Powershell gibi bir şey kullanmayı düşündünüz mü?

I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier? Aslında, tam tersi bir problem yaşıyorum, komut yorumlayıcısını listesinin karakter dizisi olarak ele almasının bir yolunu bulmaya çalışıyorum ve onları joker karakter olarak etkisiz hale getirmesini engellemeye çalışıyorum. Örneğin, for %i in (foobar baz really?) do @echo %ison öğeyi (tedavi edecek really?bir dosya adı joker olarak) ve adlandırılmış hiçbir dosya varsa atlayın really1, reallyz☹ vb
Synetech

1
@Synetech - ?Windows dosya sistemindeki dosya adları için yasal bir karakter değildir. Karakter sadece bir joker karakter olarak yorumlanabilir. MSDN'de Dosya, Yol ve Ad Alanlarını Adlandırma ve TechNet'te joker karakter kullanma konusuna bakın .
jww 29:15

Yanıtlar:


18

DOS ve dolayısıyla Windows cmd.exe, kabuk tarafından joker genişlemesini hiçbir zaman desteklemedi. Genişletme yapmak her zaman uygulamaya bağlıydı.

Bu, genişletmeyi desteklemeyen bir uygulama kullanıyorsanız her zaman başka bir rota bulmanız gerekeceği anlamına gelir. Yapabilirdin:

  • İlgilendiğiniz tüm dosyalara karşı bazı komutları çalıştırmak için bir FOR döngüsü kullanın
  • Genişletme gerçekleştirmek ve dosyaların listesini bir metin dosyasına koymak için dir /b > list.txtbu dirkomutu kullanın (daha sonra yapıştırmak üzere bir komut listesi oluşturmak için gerçekten çaresizseniz, daha sonra bir Excel formülü gibi bir şey kullanabilirsiniz cmdveya Excel'i kullanabilirsiniz. hücreleri dönüştürmek için tüm dosya isimleri aynı satırdadır.)

Dir'in sonuçlarını bir dosyaya aktarmanın ve elle filtreleme ve kopyalama işleminin bir kabus olacağını açıkladı. wmz'nin cevabı ve tabii ki benimki bir dosya içeriğini elle filtrelemeden işe yarar.
wullxz

1
@wullxz: Belki de, ancak bunu bir kereye mahsus olmak isteyen Powershell'e aşina olmayan biri için oldukça hızlı olabilir - ve bu sitenin arkasındaki fikir şu an ve şu an başvuruda bulunacak tüm beceri düzeylerine sahip insanlara faydalı çözümler sunmaktır. gelecek, bu yüzden gerçekten bana söylemeye gerek yok çünkü cevabımın seninki kadar iyi olmadığını düşünüyorsun.
Malvineous

1
"DOS ve sonuç olarak Windows 'cmd.exe, kabuk tarafından joker genişlemesini hiçbir zaman desteklemedi." - Microsoft'a göre doğru değil. TechNet'te joker karakterleri kullanma bölümüne bakın . (Ama doğru pratikte olduğunu düşünüyorum: o dosyalar eşleşmeyen neden Aksi takdirde, ben anlamaya çalışıyorum burada olmazdı.)
JWW

1
@jww: Gönderdiğiniz bağlantı joker karakterlerin standart kullanımını açıklar, ancak bunların kabuktan genişlediğini söyleyemiyorum. UNIX (ve daha sonra Linux ve Mac'ten farklı olarak), Microsoft, komut satırı parametrelerini olduğu gibi ileterek, uygulanacak her bir uygulamaya joker genişlemesi bıraktı.
Malvineous

1
DOS komutu 'dir Filespec / b' gerçekten iyi çalışıyor, çünkü her satırda bir dosya listesi oluşturuyor. Ek '/ s' anahtarıyla, dosya adları tam olarak nitelenir (mutlak) ve for döngüsü aracılığıyla dosya adını alan diğer herhangi bir komut satırı programına kolayca beslenebilir. Windows uygun bir globbing özelliğine sahip olmadığından yapabileceğimizin en iyisi bu.
David A. Gray

9

Yalnızca Windows 7'ye önceden yüklenmiş olan Powershell'i kullanın. Powershell, cmd komutlarını çalıştırabilir ve bir yoldaki herhangi bir yerde joker karakterleri anlayabilir.

Powershell'i başlatmak için başlangıç ​​menüsü arama kutusuna "powershell" yazıp Enter tuşuna basın.


Uygulamanın içinde tüm dosya adlarının bulunduğu bir dize bekleniyorsa, bu doğru komut dosyasıdır:

$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files

Değişim $delimiter = " "için $delimiter = ","uygulamanız virgül bekliyor, dosya adlarının listesini ayırdı.

Kod açıklaması:

  • [string]$files = $nothing - türünde boş bir değişken oluşturur string
  • ; - Birden fazla komut için bir ayırıcı, bir boru hattı değil!
  • ls *.txt | % { $files += $_.fullname + $delimiter } - tüm metin dosyalarının bir listesini alır ve sınırlayıcı tarafından ayrılmış tüm dosya adlarını içeren bir dize oluşturur.
  • application.exe $files - uygulamayı çağırır ve dosya listesini ona iletir

Hatta yinelemeli ekleyerek dosya deseni arayabilirsiniz -recurseiçin ls *.txttam kod şu şekilde görünecektir böylece:

$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files

Düzenleme:
Tahrişleri önlemek lsve dirtakma adlardır Get-ChildItemve %takma addır ForEach-Object. Kodumu kullanılan takma adlarla saklıyorum çünkü daha kısa.

EDİT 2018/04/25: 2012'ye
geri döndüm PowerShell için oldukça yeni oldum. Tabii ki unix / linux'un glob genişlemesinin kabiliyeti kadar kolay olmasa da daha kolay bir yol var:

app.exe $(ls *.txt | % {$_.FullName})

Açıklama:

  • $ () önce içindeki ifadeyi değerlendirir ve kendini ifadenin çıktısıyla değiştirir (tıpkı bastonda olduğu gibi)
  • ls *.txt glob ile eşleşen tüm dosyaların FileInfo nesnelerini alır *.txt
  • PowerShell nesne yönelimli olduğundan, her FileInfo nesnesinin tam adını çıkarmamız gerekir. PowerShell'deki bir niteliği / özelliği basitçe adlandırmak, varsayılan olarak çıktı verir. % { $_.FileName }Bunu bizim için yapar. %Döndürülen tüm öğelerin üzerinde lsdolaşır ve her nesnenin FileName çıktısını alır.

2
Her ne kadar PS kesinlikle talepleri yerine getirebiliyorsa ve bunu aşina olmanın tavsiyesi sağlam olsa da - önerdiğiniz kadar basit değil. Koşu start notepad++ *.txt(niyetiyle tüm TextFiles açmaya - o kadar kullanılan notepad ++ yapar birden fazla ad işlemek) hiçbir yerde alırsınız
wmz

1
Bunu geçici olarak çözebilirsin dir *.txt | % { notepad++.exe $_ }. Bunu basit bir not defteri ile denedim, çünkü notepad ++ 'a sahip değilim ve işe yaradı. Komut, geçerli dizindeki tüm txt dosyalarının bir listesini alır, listeyi listeden geçen ve dosya adı parametresi olarak notepad ++ ile yürüten bir sonraki komuta iletir.
wullxz

evet, ama bu eşdeğer değil. "Ab c" listesinin genişletilebileceği herhangi bir dizgeyi grep "a b c"bulmayı düşünün
wmz

5
Bir öğe listesini bir parametre olarak çalıştırmak , bir listeden bir parametre olarak her öğe ile birden çok kez çalıştırma komutuna eşdeğer değildir . Başka bir örnek: copy a+b+c resultve copy a result copy b result copy c result. (ve grep yardımcı programı PS'de var, buna denir select-string)
wmz

1
oy çok, btw OP açıklamak için chime umursamıyorum ki üzücü ...
wmz

8

Bu size bir liste verecek ve aynı zamanda adlandırılmış değişkene koyacaktır expanded_list. Toplu iş dosyasına koyun ve ile çalıştırın myBatchFile name myPattern. Boşluk içeriyorsa deseni tırnak işaretleri içine alın. Dosyalarla eşleşir, dizin yok. Parametreler olmadan çalıştır, hepsiyle eşleşir.

@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"

echo expanded_list is: 
echo %expanded_list%

Daha sonra komutunu çalıştırabilirsiniz my_command_exec %expanded_list%

UYARI! Maksimum cmd değişkeni boyutu 8191 karakterdir (XP'den itibaren), bu nedenle onu aşmak mümkündür! Size her zaman tam bir liste vermek için yardımcı programa güvenemezsiniz. Öte yandan, maksimum cmd satır uzunluğu da 8191'dir, bu nedenle zaten yürütemezsiniz.


Herhangi bir argüman belirtilmezse, exted_list geçerli dizindeki tüm dosyalara ayarlanacaktır, istenebilecek veya istenmeyebilir, bu yüzden herhangi bir argüman eklemek istemez (örneğin, "% 1" == "" ...)
JasonM1,

3

Bu cmd.exe içinde çalışır

dir /b *.ext

veya

echo | dir /b *.ext

Bu, yalnızca dosya adı için çalışır, yolun hiçbir parçası için değil. Örneğin ve dir /b TortoiseSVN\bin\sv*.exegösterecek . Ancak bir sözdizimi hatası gösterir. svn.exesvnadmin.exedir /b TortoiseSVN\bi*\svn.exe
styfle 11:15

1
kontrol edin dir /s /b. Bu size tam yolu verir.
WesternGun

3

Not, bu ayrı bir konu user619818 ve styfle'deki posterlere yorumdadır)

DIR, belirli bir türle eşleşen dosyalar için tüm alt dizinleri aramaya izin verir ve verir.

Not: Hangi alt dizinin altında olduğunu kontrol eden Kök Dizin, yazarın altında bu dizinlerin bulunduğu bir yol adı vermediği için "C: \ Programım \ Kök \" olarak kabul edilmiştir.

DIR /B /S "C:\My Program\Root\*.ext"

bu, kaynak dosyalarının tam dosya yollarını ve dosya adlarını verecektir.

sadece dosya isimlerini istiyorsan aşağıdaki gibi yapmalısın

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )

tüm bu dosyaları "C: \ Programım \ Root \ Alt Dizinler \ *. ext" 'den "D: \ Singlefolder \ *. ext"' e taşımak istediğinizi varsayalım:

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )

Gelecekte başkalarına yardımcı olacağını umuyorum. :)


1

Bu eski, ancak Windows için Linux alt sisteminde, PATH'nizde şimdi bash yapmak oldukça yaygın. Bu durumda, o zaman bu sizin için hile yapabilir:

bash -c 'cat *.txt'

tek tırnakların Windows cmd'de özel olmadığını unutmayın , bu nedenle yukarıdaki komutu cmd'den çalıştırırsanız çalışmaz. Bu aynı zamanda Cygwin veya diğer bash ortamları olan sistemler için de geçerlidir
phuclv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.