bat如何按字节长度截取文件名

比如我想截断文件名
文件名有英文、中文。
使用fname:~0,10对于中文和英文操作都是一样的。
然而中文占2个字节,截出来的会比英文长一倍。
请问如何按照10个字节截取?

该回答引用ChatGPT

要按照字节而不是字符来截取文件名,可以使用批处理中的certutil命令。certutil是Windows自带的命令行工具,可以用来执行各种加密和解密操作,包括将二进制文件转换为十六进制格式。

以下是一个示例批处理脚本,用于将文件名截取为10个字节:

@echo off
setlocal EnableDelayedExpansion

set "filename=%~1"

:: 使用 certutil 命令将文件名转换为十六进制格式
for /f "delims=" %%a in ('echo !filename! ^| certutil -f -encodehex') do set "hex=%%a"

:: 截取前 20 个字符(即 10 个字节)
set "hex=!hex:~0,20!"

:: 将截取后的十六进制字符串转换回原始文件名
set "newname="
for /l %%a in (0,2,18) do (
  set "byte=!hex:~%%a,2!"
  set /a "char=0x!byte!"
  set "newname=!newname!!char!"
)

echo Renaming "%filename%" to "%newname%"
rename "%filename%" "%newname%"

此脚本将输入的文件名作为第一个参数,并使用certutil将文件名转换为十六进制格式。然后,它截取了前20个字符(即10个字节),并将结果转换回原始文件名。最后,它使用rename命令将文件重命名为新名称。