Я пытаюсь настроить расписание задач для выполнения команды, которая устанавливает пакеты Python. Однако путь пакетов содержит некоторое пространство. Я пробовал много способов, но не смог найти хорошего решения.
Пакетный файл
@echo on
SCHTASKS /delete /tn "test" /f
SCHTASKS /create /tn "test" /sc ONCE /ST 00:00 /RL HIGHEST /tr "cmd.exe /k pip install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""
SCHTASKS /run /tn "test"
pause
Результат:
C:\Windows\system32>SCHTASKS /delete /tn "test" /f
ERROR: The system cannot find the file specified.
C:\Windows\system32>SCHTASKS /create /tn "test" /sc ONCE /ST 00:00 /RL HIGHEST /tr "cmd.exe /k pip install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""
ERROR: Invalid argument/option - 'data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl C:\test'.
Type "SCHTASKS /CREATE /?" for usage.
C:\Windows\system32>SCHTASKS /run /tn "test"
ERROR: The system cannot find the file specified.
C:\Windows\system32>pause
Press any key to continue . . .
Помогите пожалуйста "убить" пробелы в коде.
Любая помощь приветствуется
@Compo, спасибо за совет. Я отредактировал сценарий. Пожалуйста, покажите мне, как позаботиться о некоторых пробелах в команде SCHTASKS /create
Этот вопрос похож на: Как обращаться с символами кавычек при использовании cmd.exe. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
Прежде чем вы это сделаете, вам следует прежде всего использовать правильный синтаксис для команд, которые вы хотите cmd.exe
запустить. Командную строку, следующую за /C
, (по умолчанию) или /K
, всегда следует заключать в двойные кавычки. Кроме того, при запуске cmd.exe было бы разумно использовать параметр /D
перед /K
.
@tripleee Спасибо за совет. Я уже рассмотрел ваш аналогичный вопрос выше. Однако мой случай совсем другой. 1. команда cmd.exe
является аргументом другой команды. 2. команда pip install
, которую нужно выполнить в cmd.exe, также имеет следующие аргументы. 3. После pip install
идут 2 аргумента, они тоже разделены пробелом. 4. Если бы была только одна посылка, я бы с ней справился. Это означает, что после pip install
есть только один аргумент. Но с 2 пакетами я не смог. ---- Пожалуйста, помогите мне в этом конкретном случае.
@tripleee, этот связанный вопрос не похож, и вопрос не требует редактирования, чтобы доказать обратное. Этот вопрос не касается обработки вложенных двойных кавычек в cmd.exe
(о чем я уже говорил в своем предыдущем комментарии). Речь идет об обработке вложенных двойных кавычек в schtasks.exe
.
Если вы попробовали решения из дубликата, и ни одно из них не сработало, отредактируйте свой вопрос, чтобы показать нам, что именно вы пробовали и почему это не удалось (без изображений). Синтаксис цитирования не зависит от того, какую команду вы выполняете, даже в cmd
@triplee, это не решение описанной проблемы. Их целесообразно реализовать, но они не решат существующего вопроса. Команда cmd.exe
здесь не запускается, поэтому сама по себе она пока не может быть проблемой.
@Compo Раньше я так думал. Но когда я дважды заключил командную строку в кавычки, я не смог ее выполнить даже с одним аргументом после pip install
. С этой командой pip install
может работать. Вот почему я решил после этого расширить его на два аргумента. SCHTASKS /create /tn "test" /sc ONCE /ST 00:00 /RL HIGHEST /tr "cmd.exe /k pip install """C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl"""
@tripleee Не думаю, что мой вопрос дублируется из этого поста. Спасибо за ваш комментарий.
Пробовали cmd.exe /S /k "pip install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""
? Пробовали cmd.exe /k @"pip install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""
?
@DuyXike, команда cmd.exe должна выглядеть примерно так: C:\Windows\System32\cmd.exe /D /S /K "@"C:\Users\DuyXike\Appdata\Local\Programs\Python\Python312\Scripts\pip.exe" install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""
.
@tripleee Я пробовал все раньше. ошибка: ERROR: Invalid argument/option - 'install'.
Обратите внимание, что cmd.exe является аргументом команды SCHTASKS /create
. Я мог бы выполнить команду, как вы предложили, если это одна команда в командном файле.
@Compo Я попробовал ваше предложение, код будет SCHTASKS /create /tn "test" /sc ONCE /ST 00:00 /RL HIGHEST /tr "C:\Windows\System32\cmd.exe /D /S /K "@"C:\Program Files (x86)\Python36-32\Scripts\pip.exe" install "C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl" "C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl"""
, а результат — ошибка ERROR: Invalid argument/option - 'install'.
@DuyXike, я дал тебе только команду cmd.exe. Похоже, вы решили, что я дал вам ответ на сообщенную вами проблему, но это неверно. Нет смысла заставлять команду C:\Windows\System32\schtasks.exe
работать, пока вы не исправите отдельные компоненты. Затем вы можете решить проблему, следуя рекомендациям документации. Пробелы в путях к файлам можно использовать, используя два набора кавычек: один для cmd.exe
, другой для schtasks.exe
. Внешние кавычки для cmd.exe
должны быть двойными; внутренние кавычки могут быть одинарными '
или экранированными двойными кавычками \"
.
Все отличные советы от cmd-line, все звезды выше. ИМХО, вы можете устранить целый класс проблем, не используя пробелы в именах каталогов/папок. Да, я знаю, что C:\Program Files
и т. д. встроены, но зачем самому создавать себе проблемы, связанные с космосом? (-;! Удачи.
В дополнение к моим комментариям, вот моя интерпретация документированной методологии цитирования, основанная на правильных cmd.exe
параметрах и аргументах, а также отправленных вами командах.
Echo On
%SystemRoot%\System32\schtasks.exe /Delete /TN "test" /F
%SystemRoot%\System32\schtasks.exe /Create /TN "test" /TR "%SystemRoot%\System32\cmd.exe /D /S /K \"@\"%ProgramFiles(x86)%\Python36-32\Scripts\pip.exe\" install \"C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl\" \"C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl\"\"" /SC ONCE /ST 00:00
%SystemRoot%\System32\schtasks.exe /Run /TN "test"
Pause
Обратите внимание, что я намеренно удалил параметр и аргумент /RL HIGHEST
. Я не вижу причин, по которым вы должны устанавливать как СИСТЕМУ, и при этом иметь задачу с опцией cmd.exe
/K
, работающей в фоновом режиме.
Большое спасибо. Ваш результат работает как шарм. Однако, прежде чем получить ваш результат, я попробовал эту строку, она тоже работает, но я не совсем понимаю, какова роль каждой двойной кавычки. SCHTASKS /create /tn "peritec" /sc ONCE /ST 00:00 /tr "cmd.exe /k """pip install """C:\test data\Python-Installer\numpy-1.19.5-cp36-cp36m-win32.whl""" """C:\test data\Python-Installer\opencv_python-4.5.4.60-cp36-cp36m-win32.whl""""
Спасибо за отзыв о моем решении @DuyXike. Независимо от того, работает ли у вас экранирование вложенных двойных кавычек с помощью двух дополнительных двойных кавычек, то, что вы отправили в комментарии выше, не так надежно, менее эффективно и займет немного больше времени. Конечно, это ваша задача и ваш выбор, как вы решите действовать.
Прежде всего удалите
cd /d "Python-Installer"
, который не нужен и явно отображает ошибку (потому что так и должно было бытьCD /D "C:\test data\Python-Installer"
). Затем замените@echo on
в следующей строке наEcho On
(такой команды, как@echo
, не существует). Ведущий символ требуется только в том случае, если на момент анализа строкиecho
неoff
. Это, конечно, означает, чтоon
уже будет, и означает, что никогда не должно быть момента, когда@Echo On
существует как команда в пакетном файле. Я бы также посоветовал вам удалить возможность запуска задачи с наивысшими привилегиями.