Batch file 批选取名称中包含utf-8字符的随机文件

Batch file 批选取名称中包含utf-8字符的随机文件,batch-file,utf-8,Batch File,Utf 8,我想用批处理打开目录及其子目录中的随机文件。我知道有很多关于stackoverflow的问题,他们给出了代码,但我发现没有一个是utf-8字符支持的 我使用在stackoverflow中找到的以下代码 @echo off setlocal :: Create numbered list of files in a temporary file set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt" dir /b /s /a-d %1 | finds

我想用批处理打开目录及其子目录中的随机文件。我知道有很多关于stackoverflow的问题,他们给出了代码,但我发现没有一个是utf-8字符支持的

我使用在stackoverflow中找到的以下代码

@echo off
setlocal
:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"

:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N

call :openRandomFile

:: Delete the temp file
del "%tempFile%"

exit /b

:openRandomFile
set /a "randomNum=(%random% %% cnt) + 1"
for /f "tokens=1* delims=:" %%A in (
  'findstr "^%randomNum%:" "%tempFile%"'
) do start "" "%%B"
cmd /k
这样做效果很好,直到它选择了一个类似“blabla”的文件_空色デイズ.mp3”,在这种情况下,它会给出一个错误,如“文件blablaþþ?mp3找不到”。我有几十个这样的文件

我曾尝试在文件的开头使用
chcp 65001
来使用utf-8,如果我这样做了,teporary created.txt列表会显示正确的日文文件名,但此后拾取本身不再工作,因此我去掉了
@echo off
,cmd会在
set/a“randomNum=(%random%%cnt)+1”上打印一个错误
:错误:被零除

在这一点上,我再也不明白发生了什么,因为没有
chcp 65001
,这个文件工作得很好。 我不知道批次,请问,有人知道如何运行吗? 我会非常高兴的

我会试试看

) do start "" "%%~sB"
:openRandomFile
过程中,应使用其短名称打开文件


抱歉-无法测试它,因为我没有任何UTF-8文件名(我知道)

当涉及utf8/unicode字符时,您将在
findstr
和命令输出方面遇到很多问题。在这种情况下,避免它们更安全(但速度较慢)

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem%1=开始列出文件的文件夹
rem如果为空,则使用当前active directory
rem%2=文件掩码
如果使用空*则为rem
rem搜索什么
设置“文件掩码=%~2”&如果未定义文件掩码,则设置“文件掩码=*”
rem检索匹配文件的数量
设置“nFiles=0”&对于/r“%~f1。”(“%fileMask%”)中的%%a,请设置/a“nFiles+=1”
如果%n文件%lss 1退出/b
rem选择一个随机文件
设置/a“n=(%random%%%n文件)+1”
回显所选文件=%n%/%n文件%
rem计数到所选文件并启动它
2> 努尔(
对于(“%fileMask%”中的/r“%~f1.”%%a,请执行以下操作(
设置/a“n-=1”、“1/n”| |(开始“%”“%%~fa”&goto:done)
)
)
:完成

也就是说,计算文件的数量,选择其中一个,然后开始在文件列表上迭代,减少所选文件的数量。当它是
0
(我们已到达所选文件)时,
1/n
除法将失败,条件执行操作符将执行
start
命令。

Hmm,很抱歉,该文件无法执行该命令,它在
set/a“randomNum=(%random%%cnt)+1”处失败。
。无论如何都尝试了,但id无效。这可能表明
cnt
正在设置为0。在您的描述中,您说
它可以这样工作,直到它选择了一个像…
这样的文件,所以恢复导致该错误的条件,并按照指示修改
start
,因为您最初报告的错误似乎是从该行生成的。您也这样做了,但它不识别(日语)再也没有名字了。为什么
cnt
正常,而
chcp 65001
不正常?几乎什么都试过了,但都没用。从昨天起我就坐在这里,终于对所有的名字都有效了,非常感谢!