Сохраните вывод «conda активировать env_name» в переменную в пакетном файле

#python #batch-file #variables #cmd #conda

Вопрос:

Я хочу сохранить вывод команды «conda активировать env_name» в переменную в пакетном файле, чтобы определить, нужно ли мне создавать новую среду для сценария на моем устройстве.

Я попытался выполнить следующий код, в котором я сохраняю переменную как вывод и возвращаю ее обратно:

 for /f %%i in ('call conda activate env_name') do set output=%%i
echo %output%
 

Однако это возвращает:

 %output%
 

Я пробовал это с различными другими формами вывода, включая %вывода и %%вывода. Я считаю, что переменная вообще не задается, потому что, когда я использую set output=i, вместо этого она повторяет i.

Точно так же мне немного повезло с сохранением выходных данных в файл вместо этого.

 'conda activate env_name' 2>> "temp.txt"
set /p OUTPUT=<"temp.txt"
echo %OUTPUT%
 

Где на этот раз текстовый файл и повторяющий вывод переменной возвращает следующее:

 ''conda' is not recognized as an internal or external command,
 

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

 Could not find conda environment: env_name
You can list all discoverable environments with `conda info --envs`.
 

Комментарии:

1. команда есть conda , но нет 'conda . Одинарные кавычки используются только в for /f команде. Вы пробовали for /f %%i in ('call conda activate env_name 2^>^amp;1') do set output=%%i ?

2. @Stephan Это намного ближе, похоже, что теперь он сохраняет вывод как первое слово в последней строке!

3. Да, последняя строчка. for /f обрабатывает каждую непустую строку, поэтому она снова и снова перезаписывает переменную и оставляет вас с последней строкой. Используйте delims= , чтобы получить всю строку (см. for /? , Чтобы узнать больше). 2>amp;1 перенаправляет STDERR в то же место назначения, что и STDOUT, что также позволяет for /f перехватить его.

4. Может быть, вам даже не нужно for : call conda activate env_name 2>amp;1 |find "Could not find conda environment" amp;amp; echo no such env — конечно, это зависит от ваших намерений.