Зачем удалять powershell.exe -политика исполнения без ограничений внезапно заработала, но раньше ее не было

#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 ).

powershell python .aTest.py

Вообще говоря, нет необходимости использовать PowerShell для выполнения скрипта Python — достаточно прямого вызова python .aTest.py из пакетного файла.

Только в том случае, если вызов скрипта Python зависит от инициализации, выполняемой с помощью профилей PowerShell (в частности, с помощью файла текущего пользователя $PROFILE ), потребуется вызов с помощью PowerShell.


Если вам действительно нужно вызвать через 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 более подробно — пожалуйста, смотрите «Примечание:» под последним фрагментом кода.