Мой план таков:
Мой файл .ps1 называется Start.ps1, а пакетный файл — Start.bat.
В текущей пакетной конфигурации он не будет запускать окно PS от имени администратора или с разрешенным выполнением сценария.
PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -File ""C:\Users\user\Desktop\Install\StartNew.ps1""' -Verb RunAs}"
Это работает, когда каталог 1: 1, но на другой машине он не запускает установку шоколада и winget.





Поместите файлы Start.bat и Start.ps1 в один и тот же каталог.
Используйте следующее в Start.bat:
@echo off & setlocal
:: Determine the full path to the companion .ps1 file (Start.ps1)
:: based on the full path of this batch file (Start.bat)
set "PS1File=%~dpn0.ps1"
:: Now reference %PS1File% as part of the PowerShell command.
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -Verb RunAs PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \"%PS1File%\"'"
Примечание:
Вы по-прежнему будете получать приглашение UAC для авторизации создания процесса с повышенными правами (чего вы можете избежать, только если отключите UAC, что настоятельно не рекомендуется).
Как отмечает Compo, процесс с повышенными правами будет видеть C:\Windows\System32 в качестве своего рабочего каталога; если вашему .ps1 скрипту нужен другой (и он сам не меняется на него), вам нужно переключиться на вложенный -File на вложенный -Command вызов, который вызывает Set-Location перед вызовом скрипта.
Чтобы полностью деактивировать политику выполнения, используйте -ExecutionPolicy Bypass вместо -ExecutionPolicy Unrestricted, как показано выше. (Обычно это не имеет значения на практике, но последний запросит сценарии, загруженные из Интернета).
Нет причин использовать "& { ... }" для вызова кода, переданного в интерфейс командной строки PowerShell через параметр -Command (-c) — просто используйте "..." напрямую, как в приведенном выше коде. В более старых версиях документации CLI ошибочно предполагалось, что & { ... } требуется, но с тех пор это было исправлено.
Вы знаете, что можете использовать переменные среды на любом из языков. Также имейте в виду, что при работе с повышенными правами (под управлением администратора) текущий рабочий каталог меняется на
\Windows\System32.