批处理 - 将文件移动到字母顺序中,包括 unicode 或 'strange' 个字符

Batch - move files into alphabetical forders including unicode or 'strange' characters

我有一些文件,我想将它们移动到以前未创建的按字母顺序排列的文件夹中。对于批处理,我想生成文件夹。这些文件必须按照文件的第一个字母

移动到这些文件夹中

我的目录中有一个多语言文件列表,如下所示:

中文
alfa
35h
Ĕuid
لعربية
សេវិនខ្មែរ

我尝试使用此命令将文件移动到使用第一个文件夹字母排序的字母文件夹中

@echo off
setlocal enabledelayedexpansion

for /d %%i in (*) do (
  set first=%%i
  set first=!first:~0,1!
  md !first! 2>nul
  if not "!first!" == "%%i" move "%%i" "!first!\%%i" 
)

没有任何反应。
这部分

for /d %%i in (*) do (

创建文件夹和移动文件夹而不是文件,但我想在生成的文件夹中移动文件(我不想之前创建文件夹)

您当前使用的是 for /d,它适用于目录,不适用于文件。由于您有文件,因此您需要 for 循环来处理它们。如果您只是删除 /d,它就会这样做。但是,请注意,这意味着它还会移动批处理文件本身。如果你不想要那样,那么你需要用逻辑来排除它。像这样:

@echo off
setlocal enabledelayedexpansion

for %%i in (*) do (
  set first=%%i
  if not "!first!" == "%0" (
    set first=!first:~0,1!
    md !first! 2>nul
    if not "!first!" == "%%i" move "%%i" "!first!\%%i" 
  )
)

编辑!支持

如果文件名包含感叹号,它将不起作用,因为启用延迟扩展后,它会将其视为变量定界符的一部分。解决它的方法是将文件名分配给变量 before 你启用延迟扩展:

@echo off
setlocal

for %%i in (*) do (
  set name=%%i
  setlocal enabledelayedexpansion
  if not "!name!" == "%0" (
    set first=!name:~0,1!
    md !first! 2>nul
    if not "!first!" == "!name!" move "!name!" "!first!\!name!" 
  )
)