通過JS獲取時長,傳遞給批處理處理。
@set @n=0; /* & echo off
cd d:\test
for /f "tokens=1,2 delims==" %%a in ('dir /b/s *.mp3^|cscript -nologo -e:jscript "%~0"') do (
set "f=%%b"
set /a h=%%a/3600+100,m=%%a%%3600/60+100,s=%%a%%60+100
setlocal enabledelayedexpansion
echo !f! !h:~1!:!m:~1!:!s:~1!
endlocal
)
pause & exit/b & rem */
//jscript代碼
WMP = new ActiveXObject("WMPlayer.OCX");
while(!WScript.StdIn.AtEndOfStream) {
f = WScript.StdIn.ReadLine();
t = WMP.newMedia(f).getItemInfo("Duration");
t = parseInt(t)
WScript.Echo(t + "=" + f)
}
將獲取到的秒數取整后傳遞給批處理處理。后來發(fā)現大神apang的方法更好。
apang的代碼
WMPlayer.OCX
@set @n=0; /* & echo off
dir /a-d /b /s *.mp3 | cscript -nologo -e:jscript "%~0"
pause & exit/b & rem */
//jscript代碼
WMP = new ActiveXObject("WMPlayer.OCX");
while(!WScript.StdIn.AtEndOfStream) {
f = WScript.StdIn.ReadLine();
t = WMP.newMedia(f).getItemInfo("Duration");
hh = Math.floor(t/3600)+100;
mm = Math.floor(t%3600/60)+100;
ss = Math.floor(t%60)+100;
t = (hh + ":" + mm + ":" + ss).replace(/\d(\d\d)/g, "$1");
WScript.Echo(t)
}
Shell.Application
@set @n=0;/* & echo off
dir /a-d /b /s *.mp3 | cscript -nologo -e:jscript "%~0" > List.txt
pause & exit/b & rem */
//jscript代碼
objShell = new ActiveXObject("Shell.Application");
while(!WScript.StdIn.AtEndOfStream) {
f = WScript.StdIn.ReadLine();
objFolder = objShell.NameSpace(f.replace(/^(.+)\\.+$/, "$1"));
objItem = objFolder.ParseName(f.replace(/^.+\\(.+)$/, "$1"));
t = objFolder.GetDetailsOf(objItem, 27);
WScript.Echo(f + " " + t);
}
第三方處理
@echo off
setlocal enabledelayedexpansion
cd z:\
(for /f "delims=" %%i in ('dir /b *.mp3') do (
for /f "tokens=3 delims=," %%j in ('tag.exe "%%i" 2^>^&1 ^| findstr "playtime"') do (
set pt=%%j
set pt=!pt: playtime =!
echo %%i^=!pt!
)
))>tag.txt
關于2^>^&1 ^|的說明:
Bathome老大Batcher的回復:
大部分命令執(zhí)行的結果可以直接通過管道傳遞給后面的命令進行后續(xù)操作:
xxx | findstr "playtime"tag比較特殊,它的輸出在2號句柄,所以需要重定向到1號句柄,然后再通過管道傳遞:
tag.exe "%%i" 2>&1 | findstr "playtime"for命令里面需要對特殊字符進行轉移,所以就變成了:
tag.exe "%%i" 2>&1 ^| findstr "playtime"
- 百度網盤
- 提取碼:
mh5q