Пакетный скрипт для сопоставления двух имен файлов в одной папке с другим расширением - PullRequest
0 голосов
/ 24 мая 2018

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

file01.jpg
file01.wav
file02.jpg
file03.jpg
file04.jpg
file04.wav

Я хочу, чтобы это совпадало, если есть jpg иwav для запуска сценария ffmpeg, и если wav не имеет соответствующего jpg, запустите другой сценарий ffmpeg, а если wav не соответствует jpg, выполните другой сценарий.

if( $jpg == $wav ) // matching filenames without extension
    do script1
else if( $jpg != $wav ) // if there is no matching jpg to wav
    if( empty($jpg) && $wav )
        do script2
    if( empty($wav) && $jpg )
        do script3

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Ответ как с пакетным, так и с PowerShell решением по аналогичным маршрутам.Выполнение dir с *.jpg *.wav и сортировка по имени.

Сортировка скриптов PowerShell - уникальна, что исключает дублирование и проверяет наличие .wav и .jgp.

## Q:\Test\2018\05\24\MatchFiles.ps1
Get-ChildItem *.wav,*.jpg|Sort-Object BaseName -Unique|ForEach-Object {
    If ((Test-Path ("{0}.wav" -f $_.BaseName )) -and
        (Test-Path ("{0}.jpg" -f $_.BaseName )) ) {
        "$($_.BaseName) Both exist"
    } elseIF (!(Test-Path ("{0}.wav" -f $_.BaseName))){
        "$($_.BaseName).wav missing"
    } else {
        "$($_.BaseName).jpg missing"
    }
}

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

:: Q:\Test\2018\05\24\MatchFiles.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
Set "Last="
For /f "delims=" %%A in ('dir /B *.wav *.jpg^|sort') Do (
    If defined Last If "%%~nA" Equ "!Last!" (
        Echo %%~nA Both exist
    ) else ( 
        if "%%~xA" equ ".wav" (
            echo %%~nA.jpg missing
        ) else (
            if not exist "%%~nA.wav" echo %%~nA.wav missing
        )
    )
    Set "Last=%%~nA"
)

Они используют один и тот же вывод (добавлен один файл05.wav для ввода):

file01 Both exist
file02.wav missing
file03.wav missing
file04 Both exist
file05.jpg missing
0 голосов
/ 24 мая 2018

Вы не предоставили ни одного собственного кода, поэтому я буду вести вас только в правильном направлении, а не дать вам полный ответ.

for %%i in (*.wav) do for %%a in (*.jpg) do if "%~ni"=="%~na" echo "%%i" = "%%a"

Мы просто сопоставляем только имя, исключая расширениеиз всех wav файлов %%~ni только с именем, без расширений всех jpg файлов %~na и просто что-то делаю с результатом, в этом случае я повторяю оба файла.

Длялучшее понимание того, как работает обработка переменных, в cmd.exe run for /?

0 голосов
/ 24 мая 2018

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

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

@Echo Off
Set "sd=C:\SomePath\To\YourFiles"
Set "e1=.jpg"
Set "e2=.wav"

Rem change working directory to source directory
CD /D "%sd%" 2>Nul || Exit /B

Rem Write files names matching extension spec to .tmp files
For %%A in (%e1% %e2%) Do (For /F "Delims=" %%B In (
        'Dir /B/A-D-S-L "*%%A" 2^Nul') Do Echo "%%~nB")>"x%%A.tmp"

Rem %e1% files only, ["%%~A%e1%"]
For /F "Delims=" %%A In ('FindStr /XLVIG:"x%e2%.tmp" "x%e1%.tmp"') Do (
    Echo %%~A%e1%
)
Echo(

Rem %e2% files only, ["%%~A%e2%"]
For /F "Delims=" %%A In ('FindStr /XLVIG:"x%e1%.tmp" "x%e2%.tmp"') Do (
    Echo %%~A%e2%
)
Echo(

Rem Both %e1% and %e2% files, ["%%~A%e1%", "%%~A%e2%"]
For /F "Delims=" %%A In ('FindStr /XLIG:"x%e2%.tmp" "x%e1%.tmp"') Do (
    Echo %%~A%e1%, %%~A%e2%
)
Echo(

Rem Delete the tmp files
Del "x%e1%.tmp" "x%e2%.tmp" >Nul 2>&1

Rem pause to show screen output
Pause

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

Если вы довольны, что он правильно определил файлы, вы можете заменить Echo строки в 15, 21 и 27 своими собственными командами, (у меня естьоставил имена файлов в скобках в виде Rem в качестве напоминания) .При желании вы можете по желанию удалить строки 17, 23, 29, 34 и 35, содержащие Rem arks и любые пустые строки.

0 голосов
/ 24 мая 2018

Раствор Powershell:

    set-location 'd:\mydirectory'

    $files      = ls "*.*"
    $dictionary = @{}

    foreach($file in $files) {
        $dictionary[$file.BaseName] += @( $file.Extension.ToLower() )
    }

    foreach($key in $dictionary.keys) {

        if( $dictionary[$key].Count -gt 1 ) {
            Write-Host $key ': wav and jpg'
        }
        elseif( $dictionary[$key] -eq '.wav' ) {
            Write-Host $key ': wav only'
        }
        elseif( $dictionary[$key] -eq '.jpg' ) {
            Write-Host $key ': jpg only'
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...