我想制作一个 .bat
文件,该文件将打开随机文件夹/子文件夹中的第一个文件,与 .bat
文件位于同一位置。
我当前拥有的代码只能打开一个随机文件。
@echo off
setlocal enableextensions disabledelayedexpansion
set "rootFolder=G:\Movies\Anime"
for /f "usebackq tokens=1,* delims=:" %%a in (`
cmd /q /v /e /c "for /f delims^= %%a in ('dir /a-d /s /b "%rootFolder%"') do echo(!random!:%%a"
^| sort 2^>nul
^| cmd /q /e /v /c "set /p ".^=" & echo(!.!"
`) do start "" "%%~b"
我还有一个 .bat
文件,它生成一个文本文件,其中包含同一位置的所有文件夹的列表。我不确定引用它是否会更容易。
dir /b > Animelist.txt
如果可能的话,如何排除它打开特定类型的文件,例如 jpegs/其他 .bat
文件?
最佳答案
你可以尝试一下
@echo off
setlocal enableextensions disabledelayedexpansion
set "rootFolder=%cd%"
set fileTypes= "*.avi" "*.mpeg" "*.mkv"
pushd "%rootFolder%" && (
for /f "usebackq tokens=1,* delims=:" %%a in (`
cmd /q /v /e /c "set p=&for /r %%a in (%fileTypes%) do if not !f!==%%~dpa (set f=%%~dpa&set /a ((%random% %% 16273^)+1^)*!random!&echo :%%~dpa)"
^| sort 2^>nul
^| cmd /q /e /v /c "set /p ".^=" && echo(!.!"
`) do pushd "%%~b." && (
for /f "delims=" %%c in ('
dir /b /a-d /on %fileTypes% 2^>nul
^| cmd /q /e /v /c "set /p ".^=" && echo(!.!"
') do start "" "%%~fc"
popd
)
popd
)
将任务分解为多个部分
- 配置搜索位置和搜索内容(前两项
设置
) - 更改为起始文件夹 (
pushd
)- 对指定的文件类型执行递归搜索,并输出找到该文件的文件夹的名称(
for/f
内的第一个cmd
- 由于在同一文件夹中可以找到多个文件,请检查我们是否不会输出重复的元素(第一个
cmd
内的if
)
- 由于在同一文件夹中可以找到多个文件,请检查我们是否不会输出重复的元素(第一个
- 对于每个文件夹,生成一个随机数作为前缀 (
set/a
) 并输出文件夹 (echo
) - 按随机数对列表进行排序 (
sort
) - 获取列表中的第一个文件夹。由于列表是按随机数排序的,因此该文件夹是随机选择的(
for/f %%a
内的第二个cmd
) - 丢弃随机数并仅检索文件夹(
for/f %%a
中的delims
和tokens
的原因)
- 对指定的文件类型执行递归搜索,并输出找到该文件的文件夹的名称(
- 更改为所选文件夹 (
pushd
)- 列出所选文件夹 (
dir
) 内指定类型的文件 - 从此列表中仅选择第一个文件 (
cmd
) - 检索所选文件(
for/f %%c
) - 启动所选文件 (
start
) - 返回上一个文件夹 (
popd
)
- 列出所选文件夹 (
- 返回起始文件夹 (
popd
)
关于batch-file - 播放位于随机文件夹/子文件夹中的第一个视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124463/