我有一个目录,里面有视频文件及其对应的(隐藏).idx 文件。删除任何视频文件时,相应的 .idx 文件都会保留下来。我想定期删除这些“不相关的”.idx 文件。
下面的批处理脚本实现了这一点,但它仅在 .idx 文件名与视频文件名匹配时才有效。即:One.mts和One.idx。问题是,在创建时, .idx 文件的名称后会附加视频文件扩展名。因此,我有One.mts和One.mts.idx。
我如何让代码比较这两个名称,同时忽略 .idx 文件中附加的扩展名。最好的解决方案是,如果我可以让代码忽略文件的 .idx 部分,同时仍然比较这两个文件。这将使其他视频类型可以存储在同一目录中,而不会删除它们的 .idx 文件,因为它们与 .mts 视频文件名不匹配(我认为)。
仅供参考:.idx 文件被隐藏的事实与以下代码无关。
@echo off
echo.
echo.
for %%F in ("*.idx") do @if not exist "%%~nF.mts" echo "%%F"
echo.
echo.
set /p my_var= Press ENTER To Delete...Click X to Cancel
for %%F in (*.idx) do @if not exist "%%~nF.mts" del "%%F"
只是为了确保我理解你的问题,即使我对母语以外的语言存在认知障碍......
假设我有一个包含以下文件的文件夹......
为了为我的测试创建这些文件,我在一个空文件夹中创建了它们并运行了以下脚本:
现在这些文件放在一个文件夹中,由于不确定它们的目的或场景,我尝试使用
for /f
循环仅过滤文件where any_name.mts.idx
,这是因为该where
命令可以通过明确回答格式中使用通配符的名称来列出此名称布局中的文件*.mts.idx
。由于我已经在循环中获取了感兴趣的文件的名称,因此我只需要使用不存在文件条件来执行删除孤立文件的操作,因此如果该文件
current_name.mts
不存在,那么我明白它是用于删除的current_name.mts.idx
......echo/Deleting ".\%~1" ...
:这仅处理删除名称中包含 的不匹配文件的部分
AnyName.mts.idx
,但如果您专注于接收响应以处理删除any.idx
和/或 的孤立名称any.mts.idx
。那么,您必须使用两个For /F
循环,第二个循环使用特定的过滤器来不处理名称 的出现,这可以通过...*.mts.idx
获得。find /aVoid
echo/Deleting ".\%~1.idx" |or| ".\%%~ni.idx" ...
:cd /d "%~dp0"
,这样,它会使 bat 进入 bat 本身所在的文件夹并在其中工作。如果您将批处理保存在除要测试和/或执行删除文件操作的文件夹之外的其他文件夹中,则将其替换为您拥有 `*.mts、*.idx、*mts.idx 的文件夹的完整路径,格式如下:1.定义输出命令 do/from 中要返回的内容的用途
For /F "Delims=" .. (cmd)
,为无分隔符,因此它将使用整个输出行。2.如前所述,
where .:*.mts.idx
将仅返回明确具有通配符所满足的名称布局的文件"any file in current folder = * " + ".String1" + ".String2"
3.使用循环
call set _varible=File_Name
定义当前变量中列出的文件的名称%~file_Name_from_G
( ),使用循环定义当前变量中列出的文件的名称,然后使用:%%~nG
call set
call :Lable %%_variable_defined_and_already_expanded_on_the_same_line:SubString_remove/replace_String[.IDX]=[Nothing]%
%_name:.idx=[NOTHING!!!]%
4.您的流程将在 2 次情况下进入
:Label
,第一次是通过call :Label
传递参数 1 (%1
) 的调用"%%_name:.idx=%%"
,第二次是在循环完成 fromFor /F
循环中的文件列表时,此时不会调用:Lable
,因此参数%1
传递将不为真。然后,调用 + 参数 1 将满足真条件,而当在同一处理事件中没有调用且没有传递参数时,将满足假条件,从而按照:Label
批处理中的行顺序到达 。当
:Label
没有调用 时,它会转到:Secound_Label
,如果调用 ,它会依次检查 的存在Current_File_Name.mts
,如果不存在,它会以 的形式返回发送文件的名称.idx
的扩展名,并使用 退出/返回调用的(与相同),同样,在这个 中,如果文件存在,它会出现在delete
delete Current_File_Name.mts.idx
:Label
goto :End_Of_File
exit /b
if
) else goto :eof
5.将
:Secound_Label
使用与第一个相同的机制/逻辑,但将使用重定向中的过滤器:Lable
过滤已经在第一个循环中处理过的文件 ,从而限制仅在文件“Name_Any [.idx]”上执行,并且当没有找到“ .idx orfan文件”时,它将操作排除...For /F
| FindString /aVoid AnyFileThatContains_a_Name_With[.mts.idx]
6.是
timeout -1
一个暂停,省略使用常规文本的输出Press any key to continue ...
并等待通过添加管道(重定向)来执行命令,|
以结束Setlocal
(使用Endlocal
)并转到文件末尾,完成批处理执行,但会暂停,只要用户希望和/或发现有必要查看显示在先前操作中排除的文件名称的文本。进一步阅读:
CD /?
Set /?
For /?
For /F /?
Find /?
Where /?
Find /?
Setlocal | Endlocal /?
使用:条件执行
||
和&&
回到哪裡
GOTO :EOF
?使用:带重定向的命令
|
,<
,>
,2>
,2>&1
, ETC。使用:
Set _Varibel=SubStrings=Replace%
这是什么
%~dp0
意思?它是如何起作用的?ss64.com 上的 Windows CMD 命令 AZ 索引
您可以这样做,如果没有找到相应的视频文件,它会询问您是否要删除 idx (file\s)...