Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] forfiles с переменной @path для папок с пробелом в названии.

Ответить
Настройки темы
CMD/BAT - [решено] forfiles с переменной @path для папок с пробелом в названии.

Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте.
Есть простой код переноса файлов PDF старше 30 дней в подпапку OLD текущей папки.

Код: Выделить весь код
@echo off
chcp 1251 >nul

MD "%~dp0old"

forfiles /P "%~dp0" /D -30 /M *.pdf /C "cmd /c move @path %~dp0old\"
Подскажите, пожалуйста, в чем ошибка. Код не работает для папок, имеющих пробел в названии.

В указанном виде возвращает ошибку Неправильный параметр или аргумент - '@path'.
А если исключить из кода /P "%~dp0" , возвращает ошибку в синтаксисе команды для каждого файла.
Как исправить?

Отправлено: 00:59, 02-09-2021

 

Аватара для NickM

Ветеран


Contributor


Сообщения: 4241
Благодарности: 994

Профиль | Отправить PM | Цитировать


Цитата:
А если исключить из кода /P "%~dp0" , возвращает ошибку в синтаксисе команды для каждого файла.
Попробуйте так:

Добавьте описание переменной:
Код: Выделить весь код
set cpath=""%~dp0old\
и измените строку на такую:
Код: Выделить весь код
forfiles /D -30 /M *.pdf /C "cmd /c move @path %cpath%"
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:46, 02-09-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Забанен


Сообщения: 346
Благодарности: 64

Профиль | Цитировать


Всегда делай присваивание, как показал NickM. Только я делаю без заверш.слэша и через if всегда :
Код: Выделить весь код
set "cpath=%~dp0old"
if not exist "%cpath%" md "%cpath%"
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:34, 02-09-2021 | #3


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


NickM, wasp14, спасибо, но результат тот же - пишет "Ошибка в синтаксисе команды." при перемещении каждого файла.

Отправлено: 11:18, 02-09-2021 | #4


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


а вы будьте хитрее
Код: Выделить весь код
@echo off
chcp 1251 >nul

set "OLD=%~dp0old"
if not exist "%OLD%" md "%OLD%"

for /f "delims=" %%a in ('forfiles /p "%~dp0" /s /d -30 /m "*.pdf" /c "cmd /c echo @path"') do move "%%a" "%OLD%"
pause
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:54, 02-09-2021 | #5


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


alpap, спасибо за совет и помощь. Но... и этот вариант не идет.
"ОШИБКА: Неправильный параметр или аргумент - '@path'."

Отправлено: 12:07, 02-09-2021 | #6


Аватара для NickM

Ветеран


Contributor


Сообщения: 4241
Благодарности: 994

Профиль | Отправить PM | Цитировать


NuclearBox,

Код: Выделить весь код
@echo off
chcp 1251 >nul
set cpath=0x22%~dp0old\0x22
set "cpath=%cpath: =0x20%"
set ccmd="cmd /c move @path %cpath%"
set cdir="%~dp0old"
if not exist %cdir% md %cdir% 
forfiles /d -30 /m *.pdf /c %ccmd%
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:33, 02-09-2021 | #7


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата NuclearBox:
"ОШИБКА: Неправильный параметр или аргумент - '@path'." »
а, это из-за %~dp0 под forfiles, так она не будет работать, не заметил сразу поставил как у вас в коде, а надо вот так:
Код: Выделить весь код
@echo off
chcp 1251 >nul

set "OLD=%~dp0old"
if not exist "%OLD%" md "%OLD%"

for /f "delims=" %%a in ('forfiles /p "." /m "*.pdf" /d -30 /c "cmd /c echo @path"') do move %%a "%OLD%"
pause
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:08, 02-09-2021 | #8


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


alpap, большое вам спасибо! Да, теперь понятно где была ошибка, и теперь работает.

NickM, большое спасибо, интересная рабочая заковыристая конструкция.
Что такое 0x22 , какой принцип? - просветите, пожалуйста.

Отправлено: 13:32, 02-09-2021 | #9


Аватара для NickM

Ветеран


Contributor


Сообщения: 4241
Благодарности: 994

Профиль | Отправить PM | Цитировать


Замена спец.символов на коды.

А так да, наверное это не оч.красивая конструкция.

Код: Выделить весь код
forfiles /?
Скрытый текст
Код: Выделить весь код
    /C  <команда>       Команда, которая выполняется для каждого файла.
                        Строки команд необходимо заключать в прямые
                        кавычки. 

                        Команда по умолчанию "cmd /c echo @file".

                        Следующие переменные могут использоваться
                        в строке команды:
                        @file    - возвращает имя файла.
                        @fname   - возвращает имя файла без
                                   расширения.
                        @ext     - возвращает только расширение имени
                                   файла.
                        @path    - возвращает полный путь к файлу.
                        @relpath - возвращает относительный путь к
                                   файлу.
                        @isdir   - возвращает значение "TRUE", если типом
                                   файла является папка, и "FALSE" для файлов.
                        @fsize   - возвращает размер файла
                                   в байтах.
                        @fdate   - возвращает дату последнего изменения
                                   файла.
                        @ftime   - возвращает время последнего изменения
                                   файла.

                        Для включения специальных символов в строку команды 
                        следует использовать шестнадцатеричный код символа
                        в формате 0xHH (например, 0x09 для табуляции).
                        Перед внутренними командами CMD.exe необходимо ставить
                        "cmd /c".
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:40, 02-09-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] forfiles с переменной @path для папок с пробелом в названии.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Параметры с пробелом njg Скриптовые языки администрирования Windows 3 28-04-2020 18:11
CMD/BAT - [решено] Копирование папок с текущей датой +1 день в названии (кроме выходных) Сантей Скриптовые языки администрирования Windows 8 03-03-2015 23:26
Загрузка - После изменения переменной Path при загрузке "unmountable boot volume" А.С. Шаман Накопители (SSD, HDD, USB Flash) 13 15-10-2014 16:55
CMD/BAT - Каким образом задать значение переменной число равное кол-ву папок на диске uptk Скриптовые языки администрирования Windows 4 08-07-2009 19:02
Разное - [решено] Есть чтонибудь типа переменной среды %PATH% для dll alzasr Microsoft Windows 2000/XP 3 29-05-2009 10:36




 
Переход