Справка Windows Batch в установке переменной от вывода команды [дубликат]

Мы используем DotTrace как Вы, но в прошлом мы использовали Профилировщик Муравьев RedGate. Это - хороший инструмент также.

21
задан Joey 19 November 2012 в 13:21
поделиться

4 ответа

Это недоступно в DOS, но в консоли Windows есть команда for. Просто введите «справка для» в командной строке, чтобы увидеть все параметры. Чтобы установить единственную переменную, вы можете использовать следующее:

for /f %%i in ('find .txt') do set file=%%i

Обратите внимание, что это будет работать только для первой строки, возвращаемой из 'find .txt', потому что окна по умолчанию раскрывают переменную только один раз. Вам нужно будет включить отложенное расширение, как показано здесь .

0
ответ дан 29 November 2019 в 21:54
поделиться

Во-первых, то, чего вы ожидаете от своего вопроса, невозможно даже в оболочках 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 ...

Обратите внимание, что это также токенизируется. Вы можете дать еще несколько вариантов. Они подробно описаны в справке для команды .

6
ответ дан 29 November 2019 в 21:54
поделиться

кто вы по сути, это перечисление файлов .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
0
ответ дан 29 November 2019 в 21:54
поделиться

Вот командный файл, который вернет последний элемент, выводимый командой 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.

1
ответ дан 29 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: