Colocando o código na chave do comando de registro

0

Estou tentando fazer o que é feito nessa questão, mas quero anexá-lo a um menu de contexto no Diretório para que eu possa clicar com o botão direito do mouse em "Flatten Folder" e fazer isso por mim. Ou seja, coloque todos os arquivos individuais dentro dessa pasta até o diretório atual e exclua o diretório vazio.

Como posso achatar uma pasta no Windows 7, assumindo que todos os nomes de arquivo são diferentes?

Não tenho certeza do que estou fazendo de errado? Na chave de comando do registro eu tenho:

 cmd /K "for /f %f in ('dir "%1\*" /s/b/a-d') do if not %~ff"=="%1" move "%f" "%1"
&& for /f %f in ('dir "%1\*" /s/b/ad') do if not "%~ff"=="%1" rd /s/q "%f" pause"

EDIT: Eu tenho a opção de menu de contexto, mas quando eu clico nele, recebo um erro dizendo que o aplicativo de nome de pasta não é encontrado.

ATUALIZADO Minha alteração no registro se parece com isso: Windows Registry Editor Versão 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Flatten Folder]
@="Flatten Folder"

[HKEY_CLASSES_ROOT\Directory\shell\Flatten Folder\command]
@="cmd /K \"for /f %f in ('dir \"%1\*\" /s/b/a-d') do if not %~ff\"==\"%1\" move \"%f\" \"%1\""

Ainda não há dados, mas também não há erros.

    
por MAW74656 15.02.2013 / 22:30

2 respostas

2

Seu problema é que a linha em command não é executada através de cmd.exe - é executada através do Explorer, que não entende o comando for do cmd.exe. Você precisará colocar seu script em um arquivo separado (por exemplo, flatten.cmd ) e executá-lo. (Observe que você precisará alterar %f para %%f .)

    
por 15.02.2013 / 23:20
2

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.

    
por 14.05.2013 / 02:48