Найти самый последний файл списка подстановочных знаков в скрипте пакетного файла - PullRequest
0 голосов
/ 21 марта 2020

Учитывая дерево каталогов, например:

parent
   dir-v0.1.0
      subdir
   dir-v0.2.0
      subdir
   dir-v0.3.0  # lacks subdir

Мне нужна Windows последовательность пакетов (для Win7 +), которая работает следующим образом Unix Bash код:

   found=$(ls -dt ../dir-v0.*.0/subdir | head -1)
   if [ "$found" ]; then
      ...
   fi

Подкоманда Powershell является опцией. (К сожалению, сценарии PowerShell не запускаются при двойном щелчке.)

Подстановочные знаки командной оболочки могут появляться только в последнем элементе пути, поэтому это не работает:

   dir /o:d ..\dir-v0.*.0\subdir

РЕДАКТИРОВАТЬ : Это работает, используя powershell:

   setlocal EnableDelayedExpansion
   set findSub=get-item ..\dir-v0.*.0\subdir ^| ^
               sort -property LastWriteTime ^| ^
               select -last 1 -expandproperty FullName
   set findSub=powershell -noprofile -command "!findSub!"
   for /f "delims=" %%V in ('!findSub!') do set found=%%V
   if defined found (...)

1 Ответ

0 голосов
/ 29 марта 2020

Приведенный ниже пакетный файл можно использовать для получения полного имени каталога версии в родительском каталоге каталога пакетного файла, содержащего подкаталог subdir, причем второе число является наибольшим числом всех каталогов версий с подкаталогом subdir до тех пор, пока второе число в строке версии никогда не содержит один или несколько ведущих нулей.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "PreviousVersion=-1"
set "VersionDirectory="

for /D %%I in ("%~dp0..\dir-v0.*.0") do if exist "%%I\subdir\" (
    for /F "tokens=2 delims=." %%J in ("%%~nxI") do (
        set "CurrentVersion=%%J"
        setlocal EnableDelayedExpansion
        if !CurrentVersion! GTR !PreviousVersion! (
            endlocal
            set "VersionDirectory=%%I"
            set "PreviousVersion=%%J"
        ) else endlocal
    )
)

if defined VersionDirectory (
    echo Directory with greatest version number containing subdir is:
    echo/
    echo "%VersionDirectory%"
) else (
    echo Could not find any version directory with subdir.
)

echo/
pause
endlocal

Пакетный файл может работать быстрее, если гарантируется, что путь к каталогам версий никогда не содержит один или несколько восклицательные знаки.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "PreviousVersion=-1"
set "VersionDirectory="

for /D %%I in ("%~dp0..\dir-v0.*.0") do if exist "%%I\subdir\" (
    for /F "tokens=2 delims=." %%J in ("%%~nxI") do (
        if %%J GTR !PreviousVersion! (
            set "VersionDirectory=%%I"
            set "PreviousVersion=%%J"
        )
    )
)

if defined VersionDirectory (
    echo Directory with greatest version number containing subdir is:
    echo/
    echo !VersionDirectory!
) else (
    echo Could not find any version directory with subdir.
)

echo/
pause
endlocal

Отложенное расширение включено для всего пакетного файла в этом случае.

Примечание: Команда FOR с параметром /D игнорирует каталоги с установленным скрытым атрибутом.

Удалите %~dp0 и измените set "VersionDirectory=%%I" на set "VersionDirectory=%%~fI", если используемый пакетный файл должен запускаться в родительском каталоге текущего каталога независимо от хранилища. расположение командного файла.

Условие if exist "%%I\subdir\" можно удалить, если не имеет значения, вер В каталоге sion уже есть подкаталог subdir или нет.

Следующий код может использоваться для получения имени файла без пути к самому новому файлу в подкаталоге subdir каталога версий с наибольшим номером версии:

set "NewestFile="
for /F "eol=| delims=" %%K in ('dir "%VersionDirectory%" /A-D /B /O-D /TW 2^>nul') do set "NewestFile=%%K" & goto HaveNewestFile

:HaveNewestFile
if not defined NewestFile (
    echo Failed to find a file in directory: "%VersionDirectory%"
) else (
    echo Newest file in "%VersionDirectory%" is: "%NewestFile%"
)

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки *1034*, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... объясняет %~dp0 ... диск и путь аргумента 0, который является путем к каталогу пакетного файла, всегда заканчивающимся обратным слэсом sh.
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...