Я пытаюсь сделать то, что сделано в этом вопросе, но я хочу прикрепить его к контекстному меню в Каталоге, чтобы я мог щелкнуть правой кнопкой мыши по "Свести папку" и сделать это для меня. То есть перенесите все отдельные файлы в этой папке в текущий каталог, затем удалите пустой каталог.

Как можно сгладить папку в Windows 7, если все имена файлов разные?

Я не уверен, что я делаю не так? В ключе реестра я получил:

 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"

РЕДАКТИРОВАТЬ: у меня есть опция контекстного меню, но когда я нажимаю на нее, я получаю сообщение об ошибке, что приложение foldername не найдено.

ОБНОВЛЕНО Мои изменения в реестре выглядят так: Редактор реестра Windows, версия 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\""

Все еще нет игры в кости, но нет и ошибки.

2 ответа2

2

Я понимаю, что этой теме уже несколько месяцев, но вот мое мнение о команде в отношении контекстного меню:

Сценарий сам по себе:

(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")

Как .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\")"

Это проверено и работает на установке Win 7. Прежде всего, скрипт НЕ будет перемещать файл в корневой каталог, если файл с таким именем уже существует. Во-вторых, скрипт затем, наоборот, удаляет все пустые каталоги, пропуская все, которые могут быть не пустыми из-за конфликта имен. Я считаю, что проблема @ MAW74656 возникла из-за пробелов в путевых именах. "usebackq delims==" решает эту проблему.

Плюсом этой реализации является то, что она работает. Это не касается файлов с одинаковыми именами. Он не удалит каталог, если он не пуст.

2

Ваша проблема в том, что строка в command не выполняется через cmd.exe - она выполняется через Проводник, который не понимает встроенную команду cmd.exe for . Вам нужно будет поместить ваш скрипт в отдельный файл (например, flatten.cmd) и запустить его. (Обратите внимание, что вам нужно будет изменить %f на %%f .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .