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

Компьютерный форум 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

 

Забанен


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

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


Поменяй сразу путь, чтоб forfiles без указания папки заработал и сё ↓
Код: Выделить весь код
chcp 1251 >nul

rem поменяй путь чтоб forfiles без указания папки заработал и сё
cd /d "%~dp0"

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

rem  и тогда проще для понимания и записи будет команда, безо всяких долгих путей, просто old и всё.
forfiles /m *.pdf /d -30 /c "cmd /c move @path old && echo @path"
pause
exit
Это сообщение посчитали полезным следующие участники:

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



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

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


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


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

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


wasp14, и тебе спасибо, вариант, супер.

Всем спасибо за помощь и знания!

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


Аватара для NickM

Ветеран


Contributor


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

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


wasp14, в Вашем случае код сработает только если old является поддиректорией, верно?

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


Ветеран


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

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


Цитата wasp14:
Код: Выделить весь код
rem поменяй путь чтоб forfiles без указания папки заработал и сё 
cd /d "%~dp0"
»
Не «сё». Во-первых, это вредно вообще в принципе — наглухо менять текущий каталог на каталог, где находится пакетный файл. Во-вторых, данный код «обломится» при попытке выполнить его на сетевом ресурсе.
Это сообщение посчитали полезным следующие участники:

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


Забанен


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

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


NickM, из справки forfiles:
Код: Выделить весь код
Параметры:
    /P  <путь>          Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)
Просто скинуть на forfiles определение где работать и где искать old . Уж он-то точно не промажет.
Цитата Iska:
это вредно вообще в принципе — наглухо менять текущий каталог на каталог, где находится пакетный файл. »
какая-то херня, если чесно А что, лучше заводить выполнение файла в %SYSTEMROOT% или %USERPROFILE% ??? Всегда меняю текущую дир-у "на_туда_где_собираюсь_крутить_cmd\bat".
Цитата Iska:
данный код «обломится» при попытке выполнить его на сетевом ресурсе. »
за это ниччё не знаю. не пробовал. может и так.

Отправлено: 13:42, 04-09-2021 | #15


Ветеран


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

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


Цитата wasp14:
какая-то херня, если чесно »
да ладно
если в команде удаление, а путь покорежился - кодировка, спецсимволы ...? - мало ли, то снос всего что рядом молча без вопросов частое явление, но неприятное.

Отправлено: 13:57, 04-09-2021 | #16


Забанен


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

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


alpap, и-мен-но, по этому и нужно менять рабочую дир-у на путь к батнику. А сам батнег, лежит в созданном для него temp-e , где и упражняемся на временных файлах. temp всегда "предельно упорот", с кириллицей и пробелами, для\шобы не попасть.
Отлаженный таким способом варик скрипта, копируем в папку откуда будем жЭчь... и обычно всё хорошо.(у меня Тотал, потому менять дир-ы и копировать 'из-в' оч.просто)

Вам достаточно известно, насколько глюкав и "просто_глупый", этот язык. Здесь много неочевидных условностей. И если можно часть неопределённостей сбросить на саму "тулзу"(forfiles или dir), то это нужно делать КМК .
cd \d мой лучший друг

Отправлено: 14:35, 04-09-2021 | #17


Ветеран


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

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


Цитата wasp14:
А что, лучше заводить выполнение файла в %SYSTEMROOT% или %USERPROFILE% ??? Всегда меняю текущую дир-у "на_туда_где_собираюсь_крутить_cmd\bat". »
Для того, чтобы не пользовать порочную логику в стиле «скопировал пакетный файл в каталог, содержимое которого нужно обработать, и запустил его там» — надо пользовать аргументы пакетного файла: пакетный файл лежит в одном и том же месте, каталог для обработки передаётся ему в виде параметра (в стиле Проводника — перетащить папку на имя пакетного файла).

Цитата wasp14:
за это ниччё не знаю. не пробовал. может и так. »
Урок bat-аники:
Цитата:
ПРЕДУПРЕЖДЕНИЕ

Опасайтесь бездумного применения команды cd %~dp0 без проверки результата выполнения. Теоретически, эта команда должна сменить текущий каталог на каталог, в котором расположен командный файл. Как правило, это работает. Однако возможны неожиданности. Однажды был написан простой командный сценарий, задача которого была просто удалить все каталоги рядом с собой. В «свою» директорию он переходил как раз через cd %~dp0. Все было проверено на локальной машине – работало замечательно. После этого сценарий был помещен на файл-сервер, где ему и полагалось быть. Я зашел с помощью Far в сетевой каталог, и для контрольной проверки решил запустить файл еще раз. Дальнейшее словно в тумане. cmd.exe правильно определил местонахождение bat-файла: \\servername\sharename\directory. Однако при попытке сделать туда cd, он сказал, что UNC-пути в качестве текущих каталогов не поддерживаются и лучше он сменит текущий каталог на C:\WINDOWS… Это было действительно мудрое решение… Часть сценария, отвечавшая за удаление всех каталогов, сработала отлично – хорошо, что я успел вовремя остановить это безумие.

В тот день я узнал, что такое System Restore…
В принципе, можно разрешить использование UNC-путей в качестве текущего каталога (в реестре):
Цитата:
Код: Выделить весь код
   [HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
   "DisableUNCCheck":REG_DWORD
   (применительно только к NT4/2k/XP/2003/Vista/2008 и cmd.exe)
   CMD.EXE по умолчанию  не  поддерживает  UNC-пути.  Если  Far  попытаться
   выполнить команду командного процессора, в случае, если текущий  путь  -
   UNC, то в консоль выводится информация:

   "Указанный путь был использован при запуске CMD.EXE в  качестве  текущей
   папки. CMD.EXE не поддерживает пути UNC. По умолчанию выбрана  системная
   папка Windows. Ошибка в синтаксисе команды."

   CMD.EXE был запущен с указанием  '\\server\share'  в  качестве  текущего
   каталога. Пути  UNC  не  поддерживаются.  По  умолчанию  выбран  каталог
   Windows.

   "CMD.EXE was started with the above path as the current  directory.  UNC
   paths are not supported. Defaulting to Windows directory."

   (выводимая информация может отличаться в NT4/W2k/XP/2003/Vista/2008)

   Параметр  "DisableUNCCheck"  позволяет  решить  эту  проблему.  Значение
   параметра может быть одним из следующих:
     0 - выводить предупреждающее сообщение и устанавливать текущий путь
         равный системной папке Windows.
     1 - не выводить предупреждающее сообщение и пытаться выставить текущий
         путь равный UNC пути.

   По умолчанию в Windows параметр равен 0.
   Рекомендуемое значение 1.

   Подробнее: http://www.winguides.com/registry/display.php/1247/
              или в статье Microsoft - Q156276
но это надо проделывать предварительно.

Цитата wasp14:
по этому и нужно менять рабочую дир-у на путь к батнику. »
Вот это я и называю порочной логикой. Не нужно. Мухи отдельно, котлеты отдельно должны быть.

Цитата wasp14:
cd \d мой лучший друг »
Тогда уж хотя бы:
Код: Выделить весь код
pushd "…" && (
    …
    …
    popd
)
чтобы не было мучительно больно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:00, 04-09-2021 | #18


Ветеран


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

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


Цитата wasp14:
.(у меня Тотал, потому менять дир-ы и копировать 'из-в' оч.просто) »
Тем более непонятно, почему Вы в Total Commander'е не пользуете правильный подход:
Скрытый текст


Ctrl-F, Tab:



Enter.

Отправлено: 16:17, 04-09-2021 | #19



Компьютерный форум 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




 
Переход