我一直在寻找,但我不太了解匹配文件名的正则表达式。我在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
答案 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
行中的位置以匹配您的源目录,即可对其进行测试。
如果您对它已正确识别文件感到满意,可以使用自己的命令替换Echo
,15
和21
上的27
行(我已将Rem
方括号中的文件名留在方括号中。您可以选择删除行17
,23
,29
,34
和35
,包含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