Команда с переменными в контекстном меню
Цитата: Дима от 25.03.2021, 22:30Доброго времени суток всем читающим!
Сразу отмечу, что в делах Windows и в частности реестра я только начинаю разбираться, так что тапками не кидайтесь...
К сути проблемы:
Есть задача запустить программу Robocopy с аргументами и переменными через контекстное меню.
Сама команда:robocopy /MOVE /E %cd% .., которая должна перемещать все файлы и папки сохраняя построение из дочерней папки в родительскую.
Если запустить её из командной строки, то всё работает так, как и было задумано (не обращайте внимания на ошибку одной папки, это та папка из которой собственно и выполняется команда). Но стоит попытаться перенести её в контекстное меню через реестр, начинаются проблемы.
Как выглядит мой ключ в реестре. В виде reg файла.
При попытке исполнения данной команды через контекстное меню выдаёт такую ошибку. Сам файл robocopy.exe находится как и в папке System32, так и в папке SysWOW64 в виде жёстких ссылок (я ничего не трогал, так всё и было).Была принята попытка заменить команду на файл bat с таким содержанием:
cd /d %%1
C:\Windows\System32\Robocopy.exe /MOVE /E %cd% ..
И изменен строковый параметр "(По умолчанию)" на"C:\Windows\123\MoveToParent.bat" "%1"
Что привело к новой ошибке.Прочитал в интернете, что виной всему сам строковый параметр REG_SZ который не умеет распознавать переменные, вследствие чего был заменён на параметр REG_EXPAND_SZ, но без результативно.
Ещё раз напомню, что знаний в этой сфере у меня маловато, так что рассчитываю на вашу поддержку.
Буду рад любому решению проблемы (с костылями и без), лишь бы только это всё делалось в 1 клик.
Заранее спасибо.
Доброго времени суток всем читающим!
Сразу отмечу, что в делах Windows и в частности реестра я только начинаю разбираться, так что тапками не кидайтесь...
К сути проблемы:
Есть задача запустить программу Robocopy с аргументами и переменными через контекстное меню.
Сама команда: Скопированоrobocopy /MOVE /E %cd% .., которая должна перемещать все файлы и папки сохраняя построение из дочерней папки в родительскую.
Если запустить её из командной строки, то всё работает так, как и было задумано (не обращайте внимания на ошибку одной папки, это та папка из которой собственно и выполняется команда). Но стоит попытаться перенести её в контекстное меню через реестр, начинаются проблемы.
Как выглядит мой ключ в реестре. В виде reg файла.
При попытке исполнения данной команды через контекстное меню выдаёт такую ошибку. Сам файл robocopy.exe находится как и в папке System32, так и в папке SysWOW64 в виде жёстких ссылок (я ничего не трогал, так всё и было).
Была принята попытка заменить команду на файл bat с таким содержанием:
Скопированоcd /d %%1
СкопированоC:\Windows\System32\Robocopy.exe /MOVE /E %cd% ..
И изменен строковый параметр "(По умолчанию)" на Скопировано"C:\Windows\123\MoveToParent.bat" "%1"
Что привело к новой ошибке.
Прочитал в интернете, что виной всему сам строковый параметр REG_SZ который не умеет распознавать переменные, вследствие чего был заменён на параметр REG_EXPAND_SZ, но без результативно.
Ещё раз напомню, что знаний в этой сфере у меня маловато, так что рассчитываю на вашу поддержку.
Буду рад любому решению проблемы (с костылями и без), лишь бы только это всё делалось в 1 клик.
Заранее спасибо.
Цитата: Сергей от 25.03.2021, 22:43Добрый вечер 🖐
Можете показать, какая точная команда у Вас сработала в Командной строке?
Добрый вечер 🖐
Можете показать, какая точная команда у Вас сработала в Командной строке?
Цитата: Дима от 25.03.2021, 23:40Цитата: Сергей от 25.03.2021, 22:43Добрый вечер
Можете показать, какая точная команда у Вас сработала в Командной строке?Добрый! Сработала команда
robocopy /MOVE /E %cd% ..находясь в исполняемой папке (cd C:\Users\dmitry например). Синтаксис Robocopy, где%cd%это источник (текущая папка), а..- назначение (каталог выше по иерархии папки).
Цитата: Сергей от 25.03.2021, 22:43Добрый вечер
Можете показать, какая точная команда у Вас сработала в Командной строке?
Добрый! Сработала команда Скопированоrobocopy /MOVE /E %cd% .. находясь в исполняемой папке (cd C:\Users\dmitry например). Синтаксис Robocopy, где Скопировано%cd% это источник (текущая папка), а Скопировано.. - назначение (каталог выше по иерархии папки).
Цитата: ЯR от 26.03.2021, 10:23Здравствуйте!
Есть ещё один вариант, без использования реестра.
Создаём командный файл (cmd) с таким содержимым:@for %%f in (%*) do @move /Y %%f "%%~dpf..\"перемещаем его в "укромное место", далее, переходим в папку
SendTo— C:\Users\ИМЯ ПОЛЬЗОВАТЕЛЯ\AppData\Roaming\Microsoft\Windows\SendTo и создаём ярлык на этот cmd-файл. Меняем имя, например: «Переместить на уровень вверх» и, в свойствах ярлыка, задаём иконку (скрин).
Теперь, при выборе файлов и папок, ПКМ в подменю «Отправить», появится возможность перемещать элементы в родительскую папку (скрин).Известные ограничения:
Если, в родительской папке существуют одноимённые файлы и папки, то элементы из дочерней папки перемещены не будут.
Здравствуйте!
Есть ещё один вариант, без использования реестра.
Создаём командный файл (cmd) с таким содержимым:
@for %%f in (%*) do @move /Y %%f "%%~dpf..\"
перемещаем его в "укромное место", далее, переходим в папку СкопированоSendTo — C:\Users\ИМЯ ПОЛЬЗОВАТЕЛЯ\AppData\Roaming\Microsoft\Windows\SendTo и создаём ярлык на этот cmd-файл. Меняем имя, например: «Переместить на уровень вверх» и, в свойствах ярлыка, задаём иконку (скрин).
Теперь, при выборе файлов и папок, ПКМ в подменю «Отправить», появится возможность перемещать элементы в родительскую папку (скрин).
Известные ограничения:
Если, в родительской папке существуют одноимённые файлы и папки, то элементы из дочерней папки перемещены не будут.
Цитата: Дима от 26.03.2021, 17:27Цитата: Яр от 26.03.2021, 10:23Здравствуйте!
Есть ещё один вариант, без использования реестра.
Создаём командный файл (cmd) с таким содержимым:Здравствуйте.
Проверил вашу команду
@for %%f in (%*) do @move /Y %%f "%%~dpf..\", хоть она и рабочая, но требует выделения объекта(ов) для появления меню "Отправить". В идеале реализовать появление как у твика "Удалить содержимое папки" Хачатура или по пустому месту в папке, как и задумывалось ранее. Хоть и по сути проблема решена, хотелось бы узнать в чём причина ошибок, описанных мною в первом сообщении темы.Спасибо за решение!
Цитата: Яр от 26.03.2021, 10:23Здравствуйте!
Есть ещё один вариант, без использования реестра.
Создаём командный файл (cmd) с таким содержимым:
Здравствуйте.
Проверил вашу команду @for %%f in (%*) do @move /Y %%f "%%~dpf..\", хоть она и рабочая, но требует выделения объекта(ов) для появления меню "Отправить". В идеале реализовать появление как у твика "Удалить содержимое папки" Хачатура или по пустому месту в папке, как и задумывалось ранее. Хоть и по сути проблема решена, хотелось бы узнать в чём причина ошибок, описанных мною в первом сообщении темы.
Спасибо за решение!
Цитата: Имир от 15.07.2025, 11:53Добрый день! Решил эту проблему! Нужно создать cmd-файл с содержимым [robocopy /MOVE /E "%cd%" ..]. Создать reg-файл и заменить в нём путь к cmd-файлу и название пункта контекстного меню на свои. Применить. Теперь пункт должен появляться при нажатии ПКМ по пустому месту в папке. Однако, у меня всё-же остался вопрос: как выполнить то же самое, но при нажатии ПКМ по папке, не входя в неё?
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shell\Item0]
"MUIVerb"="Название пункта контекстного меню"
[HKEY_CLASSES_ROOT\Directory\Background\shell\Item0\command]
@="Путь к cmd-файлу"
Добрый день! Решил эту проблему! Нужно создать cmd-файл с содержимым [robocopy /MOVE /E "%cd%" ..]. Создать reg-файл и заменить в нём путь к cmd-файлу и название пункта контекстного меню на свои. Применить. Теперь пункт должен появляться при нажатии ПКМ по пустому месту в папке. Однако, у меня всё-же остался вопрос: как выполнить то же самое, но при нажатии ПКМ по папке, не входя в неё?
СкопированоWindows Registry Editor Version 5.00
Скопировано[HKEY_CLASSES_ROOT\Directory\Background\shell\Item0]
Скопировано"MUIVerb"="Название пункта контекстного меню"
Скопировано[HKEY_CLASSES_ROOT\Directory\Background\shell\Item0\command]
Скопировано@="Путь к cmd-файлу"
Цитата: Mikhail от 15.07.2025, 12:07Имир, Привет.
Пропиши то же самое в веткеHKEY_CLASSES_ROOT\Directory\shell
Имир, Привет.
Пропиши то же самое в ветке СкопированоHKEY_CLASSES_ROOT\Directory\shell
Цитата: Имир от 15.07.2025, 12:45Цитата: Mikhail от 15.07.2025, 12:07Имир, Привет.
Пропиши то же самое в веткеHKEY_CLASSES_ROOT\Directory\shellСпасибо! Подскажите, пожалуйста, как удалить пункт из контекстного меню рабочего стола, но оставить его в остальных папках?
Цитата: Mikhail от 15.07.2025, 12:07Имир, Привет.
Пропиши то же самое в веткеСкопированоHKEY_CLASSES_ROOT\Directory\shell
Спасибо! Подскажите, пожалуйста, как удалить пункт из контекстного меню рабочего стола, но оставить его в остальных папках?
Цитата: Mikhail от 15.07.2025, 13:00Имир, Ну удали из HKEY_CLASSES_ROOT\DesktopBackground\Shell свою запись и все.
Имир, Ну удали из HKEY_CLASSES_ROOT\DesktopBackground\Shell свою запись и все.
Цитата: Имир от 04.08.2025, 19:45Добрый вечер. Если прописать то же самое в ветке
HKEY_CLASSES_ROOT\Directory\shell, то скрипт работает следующим образом: он извлекает содержимое не той папки, при нажатии ПКМ на которую он был запущен, а содержимое текущей папки. То есть скрипт извлекает содержимое папки, в которой вы находитесь. Есть ли способ запустить скрипт извлечения, не входя в неё?
Добрый вечер. Если прописать то же самое в ветке СкопированоHKEY_CLASSES_ROOT\Directory\shell, то скрипт работает следующим образом: он извлекает содержимое не той папки, при нажатии ПКМ на которую он был запущен, а содержимое текущей папки. То есть скрипт извлекает содержимое папки, в которой вы находитесь. Есть ли способ запустить скрипт извлечения, не входя в неё?
Цитата: Mikhail от 05.08.2025, 03:40Имир, Привет.
Напиши что тебе нужно сделать, извлечь файлы куда?, на рабочий стол?, на каталог выше и т.д.
Какой код используешь сейчас?
Имир, Привет.
Напиши что тебе нужно сделать, извлечь файлы куда?, на рабочий стол?, на каталог выше и т.д.
Какой код используешь сейчас?
Цитата: Имир от 05.08.2025, 07:54Mikhail, доброе утро. Я использую вот этот код
robocopy /MOVE /E %cd% .., прописанный в cmd-файле. Это код извлекает содержимое текущего каталога на каталог выше, а мне нужно извлечь содержимое папки в текущий каталог.
Mikhail, доброе утро. Я использую вот этот код Скопированоrobocopy /MOVE /E %cd% .., прописанный в cmd-файле. Это код извлекает содержимое текущего каталога на каталог выше, а мне нужно извлечь содержимое папки в текущий каталог.
Цитата: Mikhail от 05.08.2025, 10:21Имир, Так? проверь:
@move "%~1\*" . @for /d %%I in ("%~1\*") do @move "%%I" . @rd /s /q "%~1"Еще короче
скрипт:
@move "%~1\*" .
Имир, Так? проверь:
@move "%~1\*" .
@for /d %%I in ("%~1\*") do @move "%%I" .
@rd /s /q "%~1"
Еще короче
скрипт: Скопировано@move "%~1\*" .
Цитата: Mikhail от 06.08.2025, 03:29Имир, Забыл написать, в реестре должно быть вот так
"C:\Users\Admin\Desktop\test1.cmd" "%1", путь к батнику измени на свой.
Имир, Забыл написать, в реестре должно быть вот так Скопировано"C:\Users\Admin\Desktop\test1.cmd" "%1", путь к батнику измени на свой.