Вопрос Используйте пакет DOS для перемещения всех файлов вверх по 1 директории


Я создал командный файл, который будет выполнен через меню правой кнопки мыши в Win7. Когда я щелкаю правой кнопкой мыши по папке, я бы хотел, чтобы командный файл перемещал все файлы (за исключением папок) вверх по 1 директории. У меня это до сих пор:

PUSHHD %1
MOVE "%1\*.*"  ..\

Это, похоже, работает до тех пор, пока папка, в которой я перемещаю файлы, не имеет пробелов. Когда в папке есть пробелы, появляется сообщение об ошибке: «Синтаксис команды неверен».

Поэтому моя партия работает в папке под названием PULLTEST но не в папке под названием PULL TEST,

Опять же, мне не нужно переместить папки, просто файлы. И я бы хотел, чтобы он работал в любом каталоге на любом диске. Не будет конкретных каталогов, в которых я буду работать. Это будет случайным.


Ниже приведен файл реестра, который я сделал, если необходимо для справки.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles]
@="PullFilesUP"

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles\command]
@="\"C:\\Program Files\\MyBatchs\\PullFiles.bat\" \"%1\""

4
2017-08-17 18:56


происхождения


Каждый раз, когда кто-то говорит о интерфейсе командной строки Windows как «DOS», умирает котенок ... - Michael Kjörling


ответы:


Пакет может быть таким же простым, как этот один вкладыш:

@move "%~1\*" "%~1\.."

Тильда удаляет любые закрывающие кавычки, которые могут уже присутствовать в значении аргумента. Дополнительный набор кавычек был источником вашей проблемы.

РЕДАКТИРОВАТЬ - Вы не говорите, что хотите, если файл с тем же именем уже существует в родительском каталоге. Поскольку команда MOVE находится в пакетном файле, по умолчанию используется автоматическая перезапись файла в родительской папке. Если вы хотите, чтобы сценарий запрашивал инструкцию, предоставляя вам возможность предотвратить перезапись, вам понадобится /-Y вариант.

@move /-y "%~1\*" "%~1\.."

2
2017-08-18 16:28



Разве это не перемещает папки? all files (excluding folders), Но, тем не менее, версия OP (*.*) также не мешает этому, потому что имена папок могут содержать точки - nixda
@nixda - MOVE будет перемещать папки только в явном виде. Он никогда не будет перемещать папку, если используются подстановочные знаки. Также, *.* соответствует любому файлу, включая файлы без расширений (без точек). - dbenham
Ах, хорошо знать - nixda


Вы пишете pushd неправильно, у вас есть два h,

И вам нужно удалить %1 из move команда. Если в каталоге есть пробелы, move команда сломана.

Предположим, что ваша партия названа MoveFiles.bat, Он называется так:

MoveFiles.bat "C:\Test\With Spaces"

После замены параметра внутри пакета он выглядит следующим образом:

PUSHD "C:\Test\With Spaces"
MOVE ""C:\Test\With Spaces"*.*" ..\

Вторая команда имеет синтаксическую ошибку из-за вложенных кавычек.


Эта версия партии работает для меня:

PUSHD %1
MOVE *.* ..\

1
2017-08-18 06:21



+1 Вложенные кавычки не являются синтаксической ошибкой, но она является источником проблемы. Например, дополнительный набор кавычек, использующий ""%1\*.*"" будет работать, но это не рекомендуется. - dbenham
@dbenham Конечно! Цитаты были неправильно вложены :) - Alexey Ivanov


Причина, по которой эта ошибка выбрасывается из-за пробелов. pushd работает с пробелами, но move не делает. Попробуйте включить второй аргумент, ..\, с кавычками:

PUSHD %1
MOVE "%1*.*" "..\"

-1
2017-08-17 21:24



Добавление котировок вокруг ..\  здесь не поможет, потому что ошибка вызвана двойными кавычками в первом параметре move потому как %1 уже имеет котировки. - Alexey Ivanov