批处理 - 将文件移动到按字母顺序排列的字符,包括unicode或“strange”字符

时间:2016-04-08 21:19:47

标签: batch-processing

我有一些文件,我想将它们移到以前没有创建过的字母文件夹中。使用批处理我想生成文件夹。必须在文件的第一个字母

之后将这些文件移到这些文件夹中

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

中文
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 (

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

1 个答案:

答案 0 :(得分:0)

您目前正在使用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" 
  )
)

编辑!支持

如果文件名包含感叹号,则它将不起作用,因为启用延迟扩展时,它会将其视为变量分隔符的一部分。绕过它的方法是在启用延迟扩展之前将文件名分配给变量

@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!" 
  )
)