Иногда неспособность оболочки cmd расширять пути подстановки может быть неудобством. Мне пришлось передать 100 файлов из каталога в программу, и я не смог набрать * .ext. Вместо этого я использовал msw 'ls', чтобы вывести список в файл, а затем заменил символы новой строки пробелами, скопировал и вставил в cmd. Совсем кошмар.
Я подозреваю, что ответ будет отрицательным, но кто-нибудь имел дело с этим или придумал какой-нибудь способ облегчить это?
windows-7
command-line
wildcards
batch
cemulate
источник
источник
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
На самом деле, у меня возникла противоположная проблема, я пытаюсь найти способ заставить интерпретатор команд обрабатывать свой список как строки и не допускать его интерпретацию как подстановочных знаков. Например,for %i in (foobar baz really?) do @echo %i
будет рассматривать последний элемент (really?
) в качестве имени файла шаблона, и пропустить его , если нет файлов с именемreally1
,reallyz
и т.д. ☹?
недопустимый символ для имен файлов в файловой системе Windows. Символ может быть интерпретирован только как подстановочный знак. См. Имена файлов, путей и пространств имен в MSDN и Использование подстановочных знаков в TechNet.Ответы:
DOS и, следовательно, Windows '
cmd.exe
никогда не поддерживали расширение подстановочными символами в оболочке. Это всегда было за приложением, чтобы сделать расширение.Это означает, что вам всегда придется искать другой маршрут, если вы используете приложение, которое не поддерживает расширение. Ты мог бы:
dir /b > list.txt
чтобы использоватьdir
команду, чтобы выполнить расширение и поместить список файлов в текстовый файл (тогда вы могли бы использовать что-то вроде формулы Excel, если вы действительно хотите создать список команд для вставкиcmd
, или вы можете использовать Excel транспонировать ячейки так, чтобы все имена файлов были в одной строке.)источник
Просто используйте Powershell, который предустановлен в Windows 7. Powershell способен запускать команды cmd и понимает подстановочные знаки в любом месте пути.
Чтобы запустить Powershell, просто введите «powershell» в поле поиска в меню «Пуск» и нажмите Enter.
Если приложение ожидает строку со всеми именами файлов, это правильный сценарий:
Измените
$delimiter = " "
на,$delimiter = ","
если ваше приложение ожидает разделенный запятыми список имен файлов.Объяснение кода:
[string]$files = $nothing
- создает пустую переменную типаstring
;
- это разделитель для нескольких команд, а не конвейер!ls *.txt | % { $files += $_.fullname + $delimiter }
- получает список всех текстовых файлов и создает строку со всеми именами файлов, разделенными разделителемapplication.exe $files
- вызывает приложение и передает ему список файловВы даже можете рекурсивно искать шаблон файла, добавив
-recurse
егоls *.txt
так, чтобы весь код выглядел так:Изменить:
чтобы избежать раздражения,
ls
иdir
псевдонимыGet-ChildItem
и%
псевдонимForEach-Object
. Я держу свой код с использованием псевдонимов, потому что он короче.РЕДАКТИРОВАТЬ 2018/04/25:
в 2012 году я был довольно новым для PowerShell. Конечно, есть более простой способ, хотя он не так прост, как способность unix / linux к расширению glob:
app.exe $(ls *.txt | % {$_.FullName})
Объяснение:
ls *.txt
получает объекты FileInfo всех файлов, которые соответствуют глобу*.txt
% { $_.FileName }
делает это для нас.%
перебирает все возвращаемые элементыls
и выводит каждый объект FileName.источник
start notepad++ *.txt
(с целью открыть все TextFiles - используется Notepad ++ , как это делает обрабатывать несколько имен) не добьешьсяdir *.txt | % { notepad++.exe $_ }
. Я попробовал это с простым блокнотом, потому что у меня нет notepad ++, и это сработало. Команда получает список всех txt-файлов в текущем каталоге, передает список следующей команде, которая проходит по списку и выполняет notepad ++ с именем файла в качестве параметра.grep "a b c"
чтобы найти любую из перечисленных строк, где «ab c» будет расширен списокcopy a+b+c result
аcopy a result
copy b result
copy c result
. (и в PS существует утилита типа grep, она называетсяselect-string
)Это даст вам список, а также поместит его в переменную с именем
expanded_list
. Поместите его в командный файл и запуститеmyBatchFile name myPattern
. Заключите шаблон в кавычки, если он содержит пробелы. Совпадает с файлами, без каталогов. Запуск без параметров соответствует всем.Затем вы можете запустить свою команду с
my_command_exec %expanded_list%
ПРЕДУПРЕЖДЕНИЕ! Максимальный размер переменной cmd составляет 8191 символ (начиная с XP), поэтому его можно переполнить! Вы не можете рассчитывать на утилиту, чтобы всегда дать вам полный список. С другой стороны, максимальная длина строки cmd также равна 8191, поэтому вы не сможете выполнить ее в любом случае.
источник
Это работает в cmd.exe
или
источник
dir /b TortoiseSVN\bin\sv*.exe
покажетsvn.exe
иsvnadmin.exe
. Ноdir /b TortoiseSVN\bi*\svn.exe
показывает синтаксическую ошибку.dir /s /b
. Это дает вам полный путь.Обратите внимание, это в комментариях к постерам в отдельной ветке user619818 и styfle)
DIR может и позволяет искать во всех подкаталогах файлы, соответствующие определенному типу.
Примечание. Предполагается, что корневым каталогом для проверки того, под какими каталогами находятся все подкаталоги, является «C: \ My Program \ Root \», поскольку автор не указал путь, по которому расположены эти каталоги.
это даст полные пути к файлам и имена файлов исходных файлов.
если вам нужны только имена файлов, вы должны сделать следующее
Итак, если вы хотите переместить все эти файлы из «C: \ My Program \ Root \ Sub Directories \ *. ext» в «D: \ Singlefolder \ *. ext», вы просто делаете это:
Надеюсь, что это поможет другим в будущем. :)
источник
Это старый, но с подсистемой Linux для Windows, довольно часто иметь bash в вашей переменной PATH. Если это так, то это может помочь вам:
источник