передать вывод команды в for / f - PullRequest
0 голосов
/ 09 июля 2020

Можно ли передать вывод команды в следующий командный файл в качестве входного?

Я хотел бы передать выходные данные таких команд, как dir c:\temp |find "05" |find "new", в следующий командный файл. Поскольку у моей команды много вариантов, и я не хочу редактировать командный файл каждый раз, когда он мне нужен, поэтому я ищу способ передать вывод команды непосредственно в командный файл, вместо того, чтобы создавать командный файл. его ввод с использованием dir /b. По сути, я хотел бы найти из списка файлов (созданного с помощью команды dir) файл, имя которого содержит наибольшее число (достигается с помощью пакетного файла). Пример:

today123.txt
today456.txt
tomorrow123.txt
tomorrow456.txt

С помощью команды dir я могу отфильтровать сегодня или завтра, оставив только два файла. Затем загрузите эти два файла в пакетный файл и попросите его выбрать тот, имя которого имеет 456. Конечно, это упрощенный пример. У меня может быть больше файлов и групп, чем в примере.

for /f %%a in ('dir /b ^|sort /r ^|findstr /r [0-9]') do (
  set "filename=%%a"
  goto done
)
:done
echo the highest found is %filename%
exit /b 0

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Следующее получает наивысшее значение для данной группы:

@echo off
setlocal enabledelayedexpansion
set "search=today"
set "max=0"
for %%a in (%search%*.txt) do (
  set "name=%%~na"
  set "number=!name:%search%=!"
  if !number! gtr !max! set /a max=number
)
echo max number for %search% is %max%
set "highest=%search%%max%.txt"
echo %highest%

Внимание, здесь нет проверки ошибок вообще, поэтому это зависит от правильного формата имен файлов. (при необходимости можно добавить проверку ошибок)

Чтобы получить строку поиска в качестве параметра, просто замените set "search=today" на set "search=%~1"

0 голосов
/ 09 июля 2020

Есть множество способов. Это один из них:

@echo off & set filename=
if "%~5" == "" set "myfind=dir /b ^| find "%~2" ^| find "%~3" ^| find "%~4" ^|sort /r ^|findstr /r [0-9]"
if "%~4" == "" set "myfind=dir /b ^| find "%~2" ^| find "%~3" ^|sort /r ^|findstr /r [0-9]"
if "%~3" == "" set "myfind=dir /b ^| find "%~2" ^|sort /r ^|findstr /r [0-9]"
if "%~2" == "" set "myfind=dir /b ^|sort /r ^|findstr /r [0-9]"

pushd "%~1"
for /f %%a in ('%myfind%') do (
  set "filename=%%a"
  goto done
)
:done
popd
if not defined filename echo Not match found & exit /b 1
echo the highest found is %filename%
exit /b 0

Обычно вы запускаете его как:

batch-file-name.cmd "C:\path\to\search" "search1" "search2" "search3"

, например, используя ваш пример:

batch-file-name.cmd "c:\temp" "05" "new"

или даже расширяйте поиск:

batch-file-name.cmd "c:\temp" "05" "new" ".txt"

Как это работает: Мы устанавливаем строку поиска каждый раз, если требуется дополнительная команда find. на данный момент у нас есть до трех находок и один путь, но его можно расширить до большего числа. Однако вы должны установить их в порядке убывания. Я также добавил дополнительный оператор if not defined filename, чтобы гарантировать, что вы будете предупреждены, если результат не найден.

...