如何解决移动最后一个文件夹的文件时带有重音字符的文件名问题?

How to solve issues with file names with characters with accents on moving last folder's files?

我需要将许多文件夹中的最后 x 个文件移动到一个新文件夹

结构:

Master Folder
    Subfolder_01
        Subfolder_01_File_0001.xxx
        Subfolder_01_File_0002.xxx
        ...
        Subfolder_01_File_0125.xxx
        Subfolder_01_File_0126.xxx

    Subfolder_02
        Subfolder_02_File_0001.xxx
        Subfolder_02_File_0002.xxx
        ...
        Subfolder_02_File_0356.xxx
        Subfolder_02_File_0357.xxx

    Subfolder_03
        Subfolder_03_File_0001.xxx
        Subfolder_03_File_0002.xxx
        ...
        Subfolder_03_File_0018.xxx
        Subfolder_03_File_0019.xxx

最后 2 个文件的预期结果:

Target_Folder
        Subfolder_01_File_0125.xxx
        Subfolder_01_File_0126.xxx

        Subfolder_02_File_0356.xxx
        Subfolder_02_File_0357.xxx

        Subfolder_03_File_0018.xxx
        Subfolder_03_File_0019.xxx

我写了这段代码:

@echo off
Rem Enable accent for French name
chcp 850

Rem Set Console text color
color 0A

Rem Get master folder
SET "SourceFolder=%~1"
cd %SourceFolder%

Rem processing all subfolders
FOR /F "delims=" %%i IN ('dir /ad-h /b') DO (
    echo.
    echo; Processing Folder %%i
    cd %%i
        call :innerloop
    cd..
)

PAUSE
goto :eof

Rem get all last X (limit) files and move them to the target folder
:innerloop
setlocal
set /a "n=0, limit=2"
FOR /F "delims=" %%z IN ('dir /s /b /o-n') DO (
    echo Moving File %%z
    move "%%z" C:\Target_Folder
    2>nul set /a "n+=1, 1/(limit-n)"||goto :break
)
goto :eof

Rem stop when "limit" is reached
:break
goto :eof

它正在运行,但存在一些问题。

  1. 长folder/filename破解脚本我有a cannot find the specified path.

  2. 有时它会在目标文件夹中移动包含所有文件的子文件夹。

  3. 有时脚本会跳出主文件夹并尝试处理另一个主文件夹。

  4. 我也有一些口音和特殊字符问题。 chcp 850 转换 ' 中的一些重音 é 并用 cannot find the specified path.

  5. 打破脚本

我尝试了 chcp 1252 但是在 úó 中转换了所有控制台口音 éà 并且没有解决 ' 中转换的 écannot find the specified path问题。
我尝试将脚本保存为 ANSI、UTF-8、不带 BOM 的 UTF-8,但对这个问题没有任何影响。

要解决所有这些问题,需要更改批处理代码中的哪些内容?

没有困难的明确例子,我们就沦为理论。

改变

cd..

cd %CD%

它将被 for 开头的当前目录名替换,因此生成的目录将是明确的。

改变

FOR /F "delims=" %%z IN ('dir /s /b /o-n') DO (

FOR /F "delims=" %%z IN ('dir /a-d /b /o-n') DO (

如果目录扫描遇到目录名 (/a-d) - 删除 /s 会删除子目录扫描 - 我不知道这是否是个问题。

改变

    move "%%z" C:\Target_Folder

    move "%%~sz" C:\Target_Folder

使用短名称执行 move,这应该可以解决重音问题。