#powershell #batch-file #ps #executionpolicy
Вопрос:
У меня есть пакетный файл run.bat, который вызывает скрипт python (та же проблема, если это ps1 вместо скрипта py)
Содержимое run.bat
powershell.exe -executionpolicy unrestricted
powershell python .aTest.py
Это работало нормально до сегодняшнего дня, когда пакетный файл не вызывал скрипт python.
В окне командной строки отображается следующее сообщение:
«Попробуйте новый кроссплатформенный PowerShell https://aka/ms/pscore6»
Я нашел в Интернете, что могу подавить это сообщение с помощью-nologon, но это не помогло, кроме удаления сообщения. Я удалил следующую строку powershell.exe -политика исполнения не ограничена, и сценарий работал. С момента последнего успешного запуска и до сегодняшнего дня в системе не было никаких изменений в разрешениях пользователей или каких-либо изменений.
Почему это происходит, меня озадачивает, и изначально была добавлена политика-ExecutionPolicy, потому что без нее сценарий не запускался. Теперь все наоборот, как я могу понять, почему это произошло? Чем это было вызвано? Есть ли какая-либо разница в наличии дополнительных флагов PS, а не в том, является ли пользователь локальной группой администратора?
Система является Windows 10 и имеет одного локального администратора.
Ответ №1:
powershell.exe -executionpolicy unrestricted
- Это приведет к интерактивному сеансу PowerShell, который требует от пользователя интерактивной отправки
exit
для выхода из сеанса, и только после этого пакетный файл продолжит выполнение. -executionpolicy unrestricted
применяется только к этому сеансу (процессу).- Поскольку ни параметр
-File
, ни-Command
параметр не используются (последнее, возможно, неявно, только путем передачи команд), PowerShell выдает «логотип», т. е. сообщение об авторских правах:Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.
- Последние версии Windows PowerShell добавляют к этому сообщению сообщение, пропагандирующее кроссплатформенную версию-преемника PowerShell (Core) v6 для установки по требованию, чтобы вы увидели следующее:
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. Try the new cross-platform PowerShell https://aka.ms/pscore6
- Используйте
-NoLogo
для подавления этого вывода; однако, как подразумевалось выше, в этом нет необходимости, если вы передаете код для выполнения как часть вызова либо путем передачи пути к файлу сценария (.ps1
) в-File
(-f
), либо (возможно, позиционно) путем передачи команд(команд) в-Command
(-c
).
- Последние версии Windows PowerShell добавляют к этому сообщению сообщение, пропагандирующее кроссплатформенную версию-преемника PowerShell (Core) v6 для установки по требованию, чтобы вы увидели следующее:
powershell python .aTest.py
Вообще говоря, нет необходимости использовать PowerShell для выполнения скрипта Python — достаточно прямого вызова python .aTest.py
из пакетного файла.
Только в том случае, если вызов скрипта Python зависит от инициализации, выполняемой с помощью профилей PowerShell (в частности, с помощью файла текущего пользователя $PROFILE
), потребуется вызов с помощью PowerShell.
- В качестве отступления: используйте опцию
-NoProfile
CLI, если вы хотите запретить загрузку любых файлов профилей, что обычно правильно, чтобы обеспечить предсказуемую среду выполнения и избежать ненужной обработки.
Если вам действительно нужно вызвать через PowerShell, политика эффективного выполнения не применяется к вызову скрипта Python — она применяется только к сценариям PowerShell ( *.ps1
); если файлы профиля вызывают сценарии PowerShell, используйте следующее:
powershell.exe -ExecutionPolicy Bypass -Command python .aTest.py
Примечание: Bypass
обходит все проверки, касающиеся выполнения .ps1
сценариев, в то Restricted
время как все равно запрашивает перед выполнением сценарии, загруженные из Интернета.
Примечание. Использование -Command
имени параметра ( -c
) явно не является строго необходимым powershell.exe
для интерфейса командной строки Windows PowerShell; однако pwsh.exe
, интерфейс командной строки PowerShell (Core) 6 теперь требует этого.
Комментарии:
1. @ek777, пожалуйста, ознакомьтесь с моим обновлением, но вкратце: сообщение об авторских правах («логотип») появляется только в том случае, если вы не используете ни
-File
, ни (возможно, применено позиционно)-Command
— так это всегда работало; что нового, так это дополнительные строки , продвигающие PowerShell (ядро);-NoLogo
может подавлять все эти строки. Опять же: первыйpowershell
вызов в вашем вопросе вводит интерактивный сеанс , который блокирует пакетный файл до тех пор, пока пользователь не введетexit
команду для завершения этого сеанса (или вы не предоставите строкуexit
через stdin ) — так это всегда работало. Это действительно намерение?2. @ek777, re
Bypass
противRestricted
: короче говоря: да, ноBypass
более подробно — пожалуйста, смотрите «Примечание:» под последним фрагментом кода.