Czasami niezdolność powłoki cmd do rozwinięcia ścieżek symboli wieloznacznych może być naprawdę niedogodnością. Musiałem przekazać programowi 100 plików z katalogu i nie mogłem wpisać * .ext. Zamiast tego użyłem „ls” mingw do zrzucenia listy do pliku, a następnie zastąpiłem znaki nowej linii spacjami, skopiowałem i wkleiłem do cmd. Całkiem koszmar.
Podejrzewam, że odpowiedź brzmi „nie”, ale czy ktoś sobie z tym poradził lub wymyślił sposób, aby to ułatwić?
windows-7
command-line
wildcards
batch
kemulować
źródło
źródło
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
W rzeczywistości mam odwrotny problem, próbuję wymyślić sposób, aby interpreter poleceń traktował listę jako ciągi znaków i zapobiegał interpretowaniu ich jako symboli wieloznacznych. Na przykład,for %i in (foobar baz really?) do @echo %i
będzie traktować ostatnią pozycję (really?
) jako zamiennika nazwy pliku, a pominąć, jeśli nie ma żadnych plików o nazwachreally1
,reallyz
itp ☹?
nie jest znakiem prawnym dla nazw plików w systemie plików Windows. Postać można interpretować tylko jako symbol wieloznaczny. Zobacz Nazewnictwo plików, ścieżek i przestrzeni nazw w MSDN i Używanie symboli wieloznacznych w TechNet.Odpowiedzi:
DOS, a co za tym idzie Windows '
cmd.exe
, nigdy nie wspierały rozszerzenia znaku wieloznacznego przez powłokę. Rozbudowa zawsze zależała od aplikacji.Oznacza to, że zawsze będziesz musiał znaleźć inną trasę, jeśli korzystasz z aplikacji, która nie obsługuje rozszerzenia. Mógłbyś:
dir /b > list.txt
aby użyćdir
polecenia, aby wykonać rozwinięcie i umieścić listę plików w pliku tekstowym (możesz użyć czegoś takiego jak formuła Excela, jeśli naprawdę desperacko chcesz stworzyć listę poleceń do wklejeniacmd
, lub możesz użyć Excela do transponowania komórek, aby wszystkie nazwy plików znajdowały się w tej samej linii).źródło
Wystarczy użyć programu Powershell, który jest wstępnie zainstalowany w systemie Windows 7. Powershell jest zdolny do uruchamiania poleceń cmd i rozumie symbole wieloznaczne w dowolnym miejscu na ścieżce.
Aby uruchomić PowerShell, po prostu wpisz „powershell” w polu wyszukiwania menu Start i naciśnij klawisz Enter.
Jeśli aplikacja oczekuje ciągu zawierającego wszystkie nazwy plików, jest to właściwy skrypt:
Zmiana
$delimiter = " "
do$delimiter = ","
jeśli aplikacja oczekuje oddzielonych przecinkami listę nazw plików.Objaśnienie kodu:
[string]$files = $nothing
- tworzy pustą zmienną typustring
;
- jest separatorem dla wielu poleceń, a nie potokiem!ls *.txt | % { $files += $_.fullname + $delimiter }
- pobiera listę wszystkich plików tekstowych i tworzy ciąg ze wszystkimi nazwami plików oddzielonymi separatoremapplication.exe $files
- wywołuje aplikację i przekazuje do niej listę plikówMożesz nawet wyszukać wzorzec pliku rekurencyjnie, dodając
-recurse
go,ls *.txt
aby pełny kod wyglądał następująco:Edycja:
Aby uniknąć podrażnienia,
ls
adir
są aliasyGet-ChildItem
i%
jest aliasemForEach-Object
. Trzymam kod z używanymi aliasami, ponieważ jest on krótszy.EDYCJA 2018/04/25:
W 2012 roku byłem całkiem nowy w PowerShell. Oczywiście istnieje łatwiejszy sposób, choć nie jest tak łatwy, jak możliwość globalnej ekspansji unix / linux:
app.exe $(ls *.txt | % {$_.FullName})
Wyjaśnienie:
ls *.txt
pobiera obiekty FileInfo wszystkich plików pasujących do globu*.txt
% { $_.FileName }
robi to dla nas.%
zapętla wszystkie elementy zwracane przezls
i wypisuje każdy obiekt FileName.źródło
start notepad++ *.txt
(z zamiarem, aby otworzyć wszystkie TextFiles - Używane Notepad ++ jak to robi obsługiwać wiele nazwisk) będzie Ci nigdziedir *.txt | % { notepad++.exe $_ }
. Próbowałem tego z prostym notatnikiem, ponieważ nie mam notatnika ++ i zadziałało. Polecenie otrzymuje listę wszystkich plików txt w bieżącym katalogu, przekazuje listę do następnego polecenia, które przechodzi przez listę i wykonuje notatnik ++ z nazwą pliku jako parametrem.grep "a b c"
znalezieniu dowolnego z wymienionych ciągów, w których „ab c” byłaby rozwiniętą listącopy a+b+c result
icopy a result
copy b result
copy c result
. (i narzędzie grep like istnieje w PS, nazywa sięselect-string
)To da ci listę, a także umieści ją w zmiennej o nazwie
expanded_list
. Umieść go w pliku wsadowym i uruchom zmyBatchFile name myPattern
. Dołącz wzór ze znakami cudzysłowu, jeśli zawiera spacje. Dopasowuje pliki, bez katalogów. Uruchom bez parametrów pasuje do wszystkich.Następnie możesz uruchomić polecenie za pomocą
my_command_exec %expanded_list%
OSTRZEŻENIE! Maksymalny rozmiar zmiennej cmd wynosi 8191 znaków (XP i więcej), więc można ją przepełnić! Nie możesz liczyć na to, że narzędzie zawsze da ci pełną listę. Z drugiej strony maksymalna długość linii cmd wynosi również 8191, więc i tak nie będzie można jej wykonać.
źródło
Działa to w programie cmd.exe
lub
źródło
dir /b TortoiseSVN\bin\sv*.exe
pokażesvn.exe
isvnadmin.exe
. Aledir /b TortoiseSVN\bi*\svn.exe
pokazuje błąd składniowy.dir /s /b
. To daje ci pełną ścieżkę.Uwaga: jest to w komentarzu do plakatów w osobnym wątku user619818 i styfle)
DIR może i pozwala przeszukiwać wszystkie podkatalogi w poszukiwaniu plików pasujących do określonego typu.
Uwaga: przyjmuje się, że katalog główny, w którym znajdują się wszystkie podkatalogi, to „C: \ Mój program \ Katalog główny”, ponieważ autor nie podał ścieżki, pod którą znajdują się te katalogi
da to pełne ścieżki do plików i nazwy plików źródłowych.
jeśli chcesz tylko nazwy plików, musisz wykonać następujące czynności
więc zakładając, że chcesz przenieść wszystkie te pliki z „C: \ My Program \ Root \ Sub Directories \ *. ext” do „D: \ Singlefolder \ *. ext”, po prostu wykonaj następujące czynności:
Mam nadzieję, że pomoże innym w przyszłości. :)
źródło
Jest to stare, ale z podsystemem Linux dla Windows, dość powszechne jest teraz bash w PATH. W takim przypadku może to załatwić sprawę:
źródło