Eu percebo que este tópico tem alguns meses, mas aqui está minha opinião sobre o comando em relação a um menu de contexto:
O script por si só:
(FOR /f "usebackq delims==" %%F IN ('DIR "%1" /a-d/b/s') DO IF NOT EXIST "%1\%%~nxF" MOVE "%%F" "%1") && (FOR /f "usebackq delims==" %%F IN ('DIR "%1" /ad/b/s ^| SORT /r') DO RD "%%F")
Como um arquivo .REG:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Shell\FlattenFolder]
@="Flatten Folder"
[HKEY_CLASSES_ROOT\Directory\Shell\FlattenFolder\command]
@="CMD.EXE /c (FOR /f \"usebackq delims==\" %%F IN ('DIR \"%1\" /a-d/b/s') DO IF NOT EXIST \"%1\%%~nxF\" MOVE \"%%F\" \"%1\") && (FOR /f \"usebackq delims==\" %%F IN ('DIR \"%1\" /ad/b/s ^| SORT /r') DO RD \"%%F\")"
Isso é testado e funciona em uma configuração do Win 7. Primeiro de tudo, o script NÃO moverá um arquivo para o diretório raiz se já houver um arquivo com esse nome. Em segundo lugar, o script então, ao contrário, remove todos os diretórios vazios, ignorando qualquer um que não esteja vazio devido a um conflito de nomes. Eu acredito que o problema que o MAW74656 estava tendo é devido a espaços nos nomes de caminho. O "usebackq delims=="
resolve esse problema.
O lado positivo desta implementação é que ela funciona. Não toca nos arquivos com o mesmo nome. Não removerá um diretório, a menos que esteja vazio.