我使用的是一台摄像机,我们有一个程序,当插入电脑时,可以显示SD卡中保存的视频。在某个时候,摄像机制造商更改了保存文件的目录结构和命名约定。我想创建一个批处理文件或VBS脚本,将文件重新组织到旧结构中。这将是一个快速而肮脏的修复基于windows的PC,直到我们可以重新编写软件,其中将包括对MAC的支持。它可以是批处理文件或VBS脚本,但必须在没有安装其他软件的Windows命令提示符下运行。该相机有前置和后置摄像头,因此有2个文件需要处理,可能有1个或多个视频捕获需要重新定位。
文件夹的数量取决于保存的视频数量,假设保存了4个视频,所以原始结构看起来是这样的。
- video1
- video.TS
- video2.TS
- video2
- video.TS
- video2.TS
- video3
- video.TS
- video2.TS
- video4
- video.TS
- video2.TS
新结构看起来像这个
- Normal
- F
- DATETIME-000001F.TS
- DATETIME-000002F.TS
- DATETIME-000003F.TS
- DATETIME-000004F.TS
- R
- DATETIME-000001R.TS
- DATETIME-000002R.TS
- DATETIME-000003R.TS
- DATETIME-000004R.TS
目标是将这些文件移动到较旧的文件结构中,以便软件可以读取和显示它们。我已经有一个在插入SD卡时运行的批处理文件,所以我的假设是,在正常进程启动之前,我可以包含一些脚本来移动这些文件。我对脚本很生疏,需要一些指导。
我当前的脚本是这样的。
setlocal enableextensions enabledelayedexpansion
set count=0
for %%x in (NormalF*.TS) do (
set /a count += 1
mkdir video!count!
move /Y NormalF*.TS video!count!video.TS
move /Y NormalR*.TS video!count!video2.TS
)
endlocal
总是有2个视频,1个用于前置摄像头,1个为后置摄像头,所以我只使用";F";目录以获取计数。
如果没有move命令,它创建的目录结构就很好。。。如果有1个文件,它只创建1个文件夹,如果有8个文件,则创建8个文件夹。但是当存在多个文件时,它希望将所有文件放在第一个文件夹中。我想我需要嵌套另一个循环,但我所尝试的一切都失败了,这是最接近的尝试。
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "destdir=u:your results"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%normalF*-*.ts" '
) DO (
SET "video2=%%~na"
SET "video2=!video2:~0,-1!R%%~xa"
FOR /f "tokens=2delims=.-" %%i IN ("%%a") DO (
SET "video=%%i"
SET /a video=1!video:~0,-1!-1000000
MD "%destdir%video!video!" 2>NUL
MOVE /y "%sourcedir%normalF%%a" "%destdir%video!video!video.TS" >NUL 2>nul
MOVE /y "%sourcedir%normalR!video2!" "%destdir%video!video!video2.TS" >NUL 2>nul
)
)
)
GOTO :EOF
您需要更改分配给sourcedir
和destdir
的值以适应您的情况。该列表使用了适合我的系统的设置。
我故意在名称中包含空格,以确保空格得到正确处理。
首先,将...F
目录中的每个文件名分配给%%a
。
然后在...R
中构造相应的文件名,方法是取%%a
的名称部分,删除最后一个字符并将其替换为R
,然后添加%%a
的扩展名。
接下来,通过使用-
和.
作为分隔符从%%a
中选择第二个令牌,从%%a
中导出序列号。通过在video
的最后一个字符前面加上1
并减去1000000将其转换为自然形式来设置目的地directoryname的数字部分。
创建目标目录并移入并重命名源文件
[根据评论进行编辑]
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "drives=d e f g h i j k l m n o p q r s t u v w x y z"
SET "sourcedir=normal"
:: locate drive that has directory "?:normalf"
FOR %%d IN (%drives%) DO IF EXIST "%%d:%sourcedir%f." SET "sourcedir=%%d:%sourcedir%"&SET "destdir=%%d:video"&GOTO founddrive
ECHO Could not find "%sourcedir%f" on any drive
GOTO :eof
:founddrive
SET /a destnum=1
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%f*-*.ts" '
) DO (
MD "%destdir%!destnum!" 2>NUL
SET "filename=%%~na"
set "filename=!filename:~0,-1!R%%~xa"
MOVE /y "%sourcedir%F%%a" "%destdir%!destnum!video.TS" >NUL 2>nul
MOVE /y "%sourcedir%R!filename!" "%destdir%!destnum!video2.TS" >NUL 2>nul
SET /a destnum+=1
)
GOTO :EOF
好的,所以这个版本首先扫描directoryname,然后选择文件,并将它们与名称更改一起放在同一驱动器上的目录video1...
中。