Мы используем DotTrace как Вы, но в прошлом мы использовали Профилировщик Муравьев RedGate. Это - хороший инструмент также.
Это недоступно в DOS, но в консоли Windows есть команда for. Просто введите «справка для» в командной строке, чтобы увидеть все параметры. Чтобы установить единственную переменную, вы можете использовать следующее:
for /f %%i in ('find .txt') do set file=%%i
Обратите внимание, что это будет работать только для первой строки, возвращаемой из 'find .txt', потому что окна по умолчанию раскрывают переменную только один раз. Вам нужно будет включить отложенное расширение, как показано здесь .
Во-первых, то, чего вы ожидаете от своего вопроса, невозможно даже в оболочках UNIX. Как оболочка должна знать, что ls | find foo
- это команда, а test.txt
- нет? Что здесь выполнять? Вот почему оболочки UNIX имеют обратную кавычку для таких вещей. В любом случае, я отвлекся.
Вы не можете установить переменные среды для многострочных строк из оболочки. Итак, теперь у нас есть проблема, потому что вывод ls
не совсем подходит.
Что вам действительно нужно здесь, так это список всех текстовых файлов, верно? В зависимости от того, что вам нужно, это сделать очень просто. Основной частью всех этих примеров является цикл for
, выполняющий итерацию по набору файлов.
Если вам просто нужно выполнить действие для каждого текстового файла:
for %%i in (*.txt) do echo Doing something with "%%i"
Это работает даже для файла имена с пробелами, и он выиграл ' • ошибочно отлавливать файлы, у которых в середине имени есть только .txt
, например foo.txt.bar
. Просто чтобы указать, что ваш подход не такой красивый, как вам хотелось бы.
В любом случае, если вам нужен список файлов, вы можете использовать небольшой трюк для создания массивов или что-то вроде этого:
setlocal enabledelayedexpansion
set N=0
for %%i in (*.txt) do (
set Files[!N!]=%%i
set /a N+=1
)
После этого у вас будет несколько переменных среды с именами Files [0]
, Files [1]
и т.д., каждая из которых содержит одно имя файла. Вы можете перебрать это в цикле с помощью
for /l %%x in (1,1,%N%) do echo.!Files[%%x]!
(обратите внимание, что здесь мы выводим лишнюю новую строку, мы могли бы удалить это, но потребовали бы еще одну строку кода: -))
Затем вы можете построить действительно длинную строку с именами файлов, если хотите. Вы можете узнать шаблон:
setlocal enabledelayedexpansion
set Files=
for %%i in (*.txt) do set Files=!Files! "%%i"
Теперь у нас есть очень длинная строка с именами файлов. Используйте его по своему желанию. Иногда это удобно для передачи группы файлов в другую программу.
Имейте в виду, что максимальная длина строки для командных файлов составляет около 8190 символов. Таким образом, это накладывает ограничение на количество вещей, которые вы можете разместить в одной строке. И да, перечисление целой группы файлов в одной строке может привести к переполнению здесь.
Вернемся к исходной точке, что пакетные файлы не имеют возможности захвата вывода команды. Другие отмечали это раньше. Для этой цели вы можете использовать для / f
:
for /f %%i in ('dir /b') do ...
Это будет перебирать строки, возвращаемые командой, по пути их токенизируя. Не так удобно, как обратные кавычки, но достаточно близко и достаточно для большинства целей.
По умолчанию токены разбиваются на пробелы, поэтому, если у вас есть имя файла «Foo bar», то внезапно у вас будет только «Foo» в %% i
и «полоса» в %% j
. Это может сбивать с толку, и такие вещи являются основной причиной, по которой вы никогда не захотите использовать для / f
только для того, чтобы получить список файлов.
Вы также можете использовать обратные кавычки вместо апострофов. если это противоречит некоторым аргументам программы:
for /f "usebackq" %%i in (`echo I can write 'apostrophes'`) do ...
Обратите внимание, что это также токенизируется. Вы можете дать еще несколько вариантов. Они подробно описаны в справке для команды
.
кто вы по сути, это перечисление файлов .txt. При этом вы можете использовать цикл for для dir cmd например
for /f "tokens=*" %%i in ('dir /b *.txt') do set file=%%i
или, если вы предпочитаете использовать ls, для поиска нет необходимости использовать конвейер.
for /f "tokens=*" %%i in ('ls *.txt') do set file=%%i
Вот командный файл, который вернет последний элемент, выводимый командой find
:
@echo off
ls | find ".txt" > %temp%\temp.txt
for /f %%i in (%temp%\temp.txt) do set file=%%i
del %temp%\temp.txt
echo %file%
для
имеет синтаксис для команды синтаксического анализа output, для / f "usebackq"
, но он не может обрабатывать каналы в команде, поэтому я перенаправил вывод во временное место.
Я настоятельно рекомендую, учитывая, что у вас есть доступ к ] ls
, что вы рассматриваете возможность использования лучшего пакетного языка, такого как bash
, или даже языка сценариев, такого как python
или ruby
. Даже bash
будет в 20 раз лучше сценариев cmd.