Bat File не может запустить сценарий powershell без жестко закодированного каталога

Мой план таков:

  1. Откройте .bat-файл
  2. Затем файл открывает окно PS с разрешенным выполнением скрипта и от имени администратора (!)
  3. Каталог должен быть переменным, чтобы он мог работать на любом компьютере в этой папке.
  4. Установите Chocolatey и Winget для установки приложений.
  5. Должен быть без ввода пользователем.

Мой файл .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.

Вы знаете, что можете использовать переменные среды на любом из языков. Также имейте в виду, что при работе с повышенными правами (под управлением администратора) текущий рабочий каталог меняется на \Windows\System32.

Compo 06.08.2023 21:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Поместите файлы 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 ошибочно предполагалось, что & { ... } требуется, но с тех пор это было исправлено.

Другие вопросы по теме

Можно ли еще больше сократить эту команду powershell? Я хочу попробовать ускорить это. (Один лайнер отправлен из пакетного скрипта)
Как мы можем создать файл .BAT, который может выключать компьютер через заданное время и показывать оставшееся время при каждой загрузке?
BATCH для удаления и копирования (резервного копирования) определенных папок и подпапок
Как извлечь встроенную ссылку из сохраненного в виде текста html-документа ИЛИ как использовать xidel для извлечения правильной ссылки?
Процент входа в файл .bat не работает с командой powershell
Как запустить исполняемый файл с графическим интерфейсом и консольную программу и завершить консольное приложение в приложении с графическим интерфейсом, закрытом пользователем?
Как создать файл журнала приглашения Windows при запуске файла bat
Каков более эффективный способ удаления дубликатов из CSV-файла на основе определенных полей с помощью пакетного сценария (и, если необходимо, gawk)?
Как я могу объединить два текстовых файла, но добавить только недостающие строки из первого файла в пакетном файле Windows?
Как я могу изменить пакет непрерывной проверки связи для ежедневной записи в новый файл в качестве запланированной задачи?