Batch file 批选取名称中包含utf-8字符的随机文件
我想用批处理打开目录及其子目录中的随机文件。我知道有很多关于stackoverflow的问题,他们给出了代码,但我发现没有一个是utf-8字符支持的 我使用在stackoverflow中找到的以下代码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
@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
不正常?几乎什么都试过了,但都没用。从昨天起我就坐在这里,终于对所有的名字都有效了,非常感谢!