批处理脚本,用于匹配具有不同扩展名的同一文件夹中的两个文件名

时间:2018-05-24 04:47:50

标签: powershell batch-file ffmpeg

我一直在寻找,但我不太了解匹配文件名的正则表达式。我在SO中看到有些问题与不同文件夹中的两个文件名相匹配,但我在相同的文件夹中查找。

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

如果有jpgwav来运行ffmpeg脚本,并且wav没有匹配的jpg,我希望它匹配运行另一个ffmpeg脚本,如果wavjpg没有匹配,请执行另一个脚本。

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 :(得分:0)

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'
        }
    }

答案 1 :(得分:0)

您没有提供任何自己的代码,所以我只会引导您朝着正确的方向前进,而不是给您一个完整的答案。

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

我们仅匹配名称,不包括wav所有%%~ni文件的扩展名,仅限名称,不包含所有jpg个文件%~na的扩展名,只需执行某些操作结果,在这种情况下,我回显两个文件。

为了更好地了解变量处理的工作原理,请cmd.exe运行for /?

答案 2 :(得分:0)

为了让事情变得简单易懂,我想我会发布一种方法,将其分解为单独的程序。

我们的想法是列出与各个保留文件中的扩展名匹配的文件名。然后使用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行中的位置以匹配您的源目录,即可对其进行测试。

如果您对它已正确识别文件感到满意,可以使用自己的命令替换Echo1521上的27(我已将Rem方括号中的文件名留在方括号中。您可以选择删除行1723293435,包含Rem arks和任意空行的行

答案 3 :(得分:0)

批量和PowerShell解决方案遵循类似路线的答案。 使用*.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"
)

它们共享相同的输出(为输入添加了一个file05.wav):

file01 Both exist
file02.wav missing
file03.wav missing
file04 Both exist
file05.jpg missing