Loading
Forfiles — консольная утилита Windows для операций с файлами, которая уже присутствует в стандартной поставке в Windows7 и WS2008R2. Позволяет производить поиск по маске иили возрасту и применять действия к найденным файлам.
Например, данная команда найдет и удалит все файлы по маске *.log старше месяца:
forfiles /P D:logs /S /D 30 /M *.log /С "cmd /C del @file" >> log.txt
Где:
/P D:logs
— путь
/S
— рекурсивно
/D 30
— по дате, старше 30 дней
/M *.log
— маска поиска
/С cmd
— вызов командной строки
/C del
— вызов команды удалить
@file
— возвращает имена найденных файлов
>> log.txt
— перенаправить вывод команды в лог файл
Можно сохранить как батник и запихать в крон планировщик задач.
Пара примеров:
Удалить файлы в каталогах по маске .svn
по пути D:project, оставив сами каталоги:
forfiles /P D:project /S /M .svn -c "cmd /c del /S @file"
Удалить непустые каталоги по маске .svn
со всем содержимым:
forfiles /P D:project /S /M .svn -c "cmd /c rmdir /S @file"
Справка по использованию:
forfiles /? FORFILES [/P < путь>] [/M < маска_поиска>] [/S] [/C < команда>] [/D [+ | -] {dd.MM.yyyy | dd}] Описание. Выбор файла (или набора файлов) и выполнение команды с этим файлом. Программа полезна для пакетных заданий. Параметры: /P < путь> Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.). /M < маска_поиска> Поиск файлов с помощью маски. Маска поиска по умолчанию "*" . /S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S". /C < команда> Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды: @file - возвращает имя файла. @fname - возвращает имя файла без расширения. @ext - возвращает только расширение имени файла. @path - возвращает полный путь к файлу. @relpath - возвращает относительный путь к файлу. @isdir - возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов. @fsize - возвращает размер файла в байтах. @fdate - возвращает дату последнего изменения файла. @ftime - возвращает время последнего изменения файла. Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции). Перед внутренними командами CMD.exe необходимо ставить "cmd /c". /D < дата> Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан. /? Вывод справки по использованию. Примеры: FORFILES /? FORFILES FORFILES /P C:WINDOWS /S /M DNS*.* FORFILES /S /M *.txt /C "cmd /c type @file | more" FORFILES /P C: /S /M *.bat FORFILES /D -30 /M *.exe /C "cmd /c echo @path 0x09 был изменен 30 дней назад" FORFILES /D 01.01.2001 /C "cmd /c echo @fname является новым с 1-янв-2001" FORFILES /D +18.10.2013 /C "cmd /c echo @fname является новым сегодня" FORFILES /M *.exe /D +1 FORFILES /S /M *.doc /C "cmd /c echo @fsize" FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Если выдает такую ошибку (для разных языков):
ОШИБКА: Неправильный параметр или аргумент - '/С'. ERROR: Invalid syntax. Value expected for '/C'.
Значит параметр /C
не срабатывает, помогает замена на -С
, как сделано в паре примеров.
Как выяснилось, в WS2003R2 (предполагаю что на WXP тоже) срабатывают оба параметра, а в WS2008R2 и W7 только -С
.
Привелось удалять логи из каталога c:ProgramDataPath
и на выполнение действия для каждого вложенного каталога просил подтверждения. Параметра /f
— force
для forfiles нет. Пришлось сделать так:
echo Y | forfiles /P c:ProgramDataPath /S /D -21 /c "cmd /c del /s @file"
← →
SKIPtr ©
(2014-01-21 18:29)
[0]
драсте пишу задание для планировщика
нужно записать ввиде командной строки
вот пишу пример
SchTasks /Create /TN "задание" /TR "shutdown -s -t 0" /SC ONCE /ST 23:59 /SD 21/1/2014
получаю ответ
ОШИБКА: Неправильный параметр или аргумент - "-s".
подскажите в чем ошибка и как решить эту проблему
← →
Rouse_ ©
(2014-01-21 19:02)
[1]
С консоли задается нормально (ну только дата должна быть 21/01/2014), видимо пытаешься выполнить снаружи и не учитываешь кавычки, и происходит выход на SHUTDOWN у которого действительно нет параметра -s
← →
Rouse_ ©
(2014-01-21 19:04)
[2]
А вообще с планировщиком лучше работать через его интерфейс, благо он полностью документирован
http://msdn.microsoft.com/en-us/library/aa383614%28v=VS.85%29.aspx
← →
SKIPtr ©
(2014-01-21 21:38)
[3]
> видимо пытаешься выполнить снаружи и не учитываешь кавычки,
> и происходит выход на SHUTDOWN у которого действительно
> нет параметра -s
можно по подробей мне обьяснить что конкретно я делал не так
а то я щас замеил ошибку он дает не всегда
и ошибку он дает когда в параметрах присутствует пробел
у меня до этого было TN “Последнее задание”
и он писал что такая ошибка в "задание""
← →
Inovet ©
(2014-01-21 21:40)
[4]
> [3] SKIPtr © (21.01.14 21:38)
> можно по подробей
Сказали же неправильно передаёшь двойные кавычки.
← →
SKIPtr ©
(2014-01-21 22:08)
[5]
> Сказали же — неправильно передаёшь двойные кавычки.
ух ты и правда переписал кавычки и ошибка исчезла
получаеться в пояснении в качестве примера передают не правильные кавычки
← →
Inovet ©
(2014-01-21 22:32)
[6]
> [5] SKIPtr © (21.01.14 22:08)
Это в каком пояснении?
← →
SKIPtr ©
(2014-01-22 06:16)
[7]
на сайте читаю как ей пользоваться
и примеры пытаюсь запустить и вот получаю такой результат
← →
SKIPtr ©
(2014-01-22 06:16)
[8]
на сайте читаю как ей пользоваться
и примеры пытаюсь запустить и вот получаю такой результат
← →
Inovet ©
(2014-01-22 06:30)
[9]
> [7] SKIPtr © (22.01.14 06:16)
Так пример покажи.
← →
SKIPtr ©
(2014-01-22 20:01)
[10]
> Так пример покажи.
вот перенес копированием SchTasks /Create /TN “Последнее задание” /TR “shutdown –s –t 0” /SC ONCE /ST 23:59 /SD 21/12/2012
← →
Styx
(2014-01-22 20:09)
[11]
Нут так Вы из интернета скопипастили, а там CMS-ка кавычки «приукрасила»…
← →
SKIPtr ©
(2014-01-22 20:26)
[12]
еще подскажите пожалуста
как вывести содержимое заданий определеной папки
команда SchTasks /Query
выводит все папки
вот команда выводит все папки
как увидеть только содержимое конкретной папки
Ezhyg, так-то почитал про taskkill, понравилось, что там можно указывать пользователя и пароль, но не понял, как именно службу остановить или перезапустить. Где предложили такую конструкцию:
TASKKILL /F /FI «SERVICES eq wuauserv»
у меня она не работает. Что может сказать по этому поводу? Что неправильного?
Вот что выдаёт командная строка:
C:WINDOWSsystem32>TASKKILL /F /FI «SERVICES eq wuauserv»
Ошибка: Неправильный параметр или аргумент - 'eq'.
Введите "TASKKILL /?" для получения справки по использованию.
How to execute .cmd file with this commands:
TASKKILL /F /PID 14364
MOVE /Y "C:/Users/BBCCA/AppData/Roaming/DWAKU2DWAKU2.exe" "D:/DWAKU2/build- DWAKU2-Desktop_Qt_5_15_2_MinGW_64_bit_Static-Release/release"
START "" "D:/DWAKU2/build-DWAKU2-Desktop_Qt_5_15_2_MinGW_64_bit_Static-Release/release/DWAKU2.exe"
How can I execute this script with command console in qt?
As you can see — first command close qt application.
Firstly, I tried to use QProcess to execute all commands inside it.
auto programmName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
QProcess consola;
QString command = "cmd";
QStringList commandArgs;
QString subcommand1, subcommand2;
subcommand1 += "TASKKILL /IM ";
subcommand1 += programmName;
subcommand2 += "DEL /Q ";
subcommand2 += QCoreApplication::applicationFilePath();
commandArgs << "/c" << subcommand1 << "&&" << subcommand2;
qDebug() << commandArgs;
consola.startDetached(command, commandArgs);
consola.waitForFinished();
But it doesn’t execute with error:
Ошибка: Неправильный параметр или аргумент — ‘/Q’. Введите «TASKKILL
/?» для получения справки по использованию.
Translation:
Error: Incorrect parameter or argument — ‘/Q’. Enter «TASKKILL /?» for
help on how to use it.
After lots of reading docs and asking ru.stuckoverflow — gave up on this idea and tried to use cmd file.
You can read it above.
Execution of this file was:
// Make updater script
if (fileCorrect){
ui->LoadingAnimationLabel->setText(bLText + "Making updater script... " + aLText);
QFile file(appDataPath + QDir::separator() + "updater.cmd");
if (file.open(QIODevice::WriteOnly)) {
auto pid = "TASKKILL /F /PID " + QString::number(QCoreApplication::applicationPid()) + "rn";
auto move = "MOVE /Y "" + appDataPath + QDir::separator() + QFileInfo(QCoreApplication::applicationFilePath()).fileName() + "" "" + QCoreApplication::applicationDirPath() + ""rn";
auto start = "START "" "" + QCoreApplication::applicationFilePath() + ""rn";
file.write(pid.toLocal8Bit());
file.write(move.toLocal8Bit());
file.write(start.toLocal8Bit());
} else fileCorrect = false;
file.close();
}
// Installing updates
if (fileCorrect){
ui->LoadingAnimationLabel->setText(bLText + "Installing update files... " + aLText);
auto command = appDataPath + QDir::separator() + "updater.cmd";
QProcess updater;
updater.startDetached(appDataPath + QDir::separator() + "updater.cmd");
}
When programm executed this file — only first command was executed.
But when I tried to execute this file by clicking it — it worked fine….