PowerShell не будет работать от имени администратора с двойными кавычками

Проблема в том, что '-Verb RunAs' по какой-то причине не работает с '\"'. и мне нужны кавычки для лучшей обработки путей

:: Check for admin privilage
openfiles > nul 2>&1
if !errorlevel! neq 0 (
    echo | set /p = "The execution needs elevated privileges (y|n)"
    choice /n
    if !errorlevel! equ 1 (
        start /b /wait PowerShell -Command "Start-Process '%~f0' -ArgumentList '%res% -ico \"%icon%\" -dir \"%directory%\"' %style% -Verb RunAs"
        exit /b
    )
)

когда я удаляю один из них, другой работает

::like this
start /b /wait PowerShell -Command "Start-Process '%~f0' -ArgumentList '%res% -ico \"%icon%\" -dir \"%directory%\"' %style%"

::or this
start /b /wait PowerShell -Command "Start-Process '%~f0' -ArgumentList '%res% -ico %icon% -dir %directory%' %style% -Verb RunAs"

Или когда я конвертирую его в исполняемый файл, он работает

Я не знаю, почему это происходит, возможно, глюк или что-то в этом роде. Я надеюсь, что кто-то найдет решение

Пожалуйста, не отмечайте спам. PowerShell не является пакетным файлом Windows, пакетом Spring или любым другим добавленным вами пакетным тегом, и то, что в тегах есть слово «пакетный», не означает, что они примерно одинаковы. Ваш вопрос конкретно касается PowerShell, и это единственный тег, который применим к вашему вопросу. Остальные неуместные теги я удалил. Спам-тег — очень хороший способ быстро собрать отрицательные голоса и закрыть свой вопрос. Теги здесь имеют отношение и значение — используйте их правильно.

Ken White 11.07.2024 03:01

@KenWhite, хотя некоторые из исходных тегов определенно неприменимы, batch-file действительно применим, поэтому я восстановил его: вы также должны удовлетворять синтаксису (пакетного файла) требованиям cmd.exe, а не только PowerShell, то есть среде, в которой работает PowerShell. CLI вызывается из дел.

mklement0 11.07.2024 03:49

@KenWhite: Ваш комментарий не касается моего отзыва, суть которого такова: здесь нужно учитывать два языка, поэтому оба тега подходят. Я пометил ваши действия для вмешательства модератора в виде вашего последнего комментария.

mklement0 11.07.2024 04:06

@KenWhite :: Check for admin privilage — это определенно пакетный комментарий. То же самое с if !errorlevel! neq 0 (), set /p, start /b или !errorlevel!, которые являются командами cmd. ОП вызывает PowerShell из cmd, но это не означает, что единственным языком здесь является PowerShell. Кто сказал, что в пакетной части не будет ошибок?

phuclv 11.07.2024 08:39
if !errorlevel! neq 0 может быть if errorlevel 1; echo | set /p = "The execution needs elevated privileges (y|n)" и choice /n могут быть просто choice /m "The execution needs elevated privileges"; if !errorlevel! equ 1 может быть if not errorlevel 2; и start /b /wait должно быть start "" /b /wait.
Compo 11.07.2024 09:09

@mklement0, я пробовал SET ArgumentList=%res% -ico \"%icon%\" -dir \"%directory%\" и start /b /wait PowerShell -Command "Start-Process '%~f0' -ArgumentList $Env:ArgumentList %style% -Verb RunAs". Эта проблема все еще сохраняется. Также попробовал PWSH, та же проблема. Но это работает, если я использую SET ArgumentList=ABC. Это как если бы Start-Process умер, если -RunAs используется со списком аргументов, содержащим `\`.

Darin 11.07.2024 12:05

@mklement0, мой комментарий кажется неверным. Похоже, проблема у -Verb RunAs НЕ в обратной косой черте, а в двойных кавычках.

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

Ответы 1

Ответ принят как подходящий

Проясним это: вы пытаетесь создать самоподнимающийся пакетный файл, то есть тот, который повторно вызывает себя с повышенными (административными) привилегиями при передаче аргументов.

Похоже, вы столкнулись с ошибкой, из-за которой повторный вызов пакетного файла с аргументами, заключенными в "...", синтаксически прерывает вызов целевого процесса, когда повышение прав запрашивается через Start-Process -Verb RunAs PowerShell. Точно не знаю, но подозреваю, что ошибка находится на уровне ниже PowerShell.

Обходной путь — вызвать пакетный файл через cmd.exe /C и заключить весь список аргументов, переданный последнему, в "..." в целом, в дополнение к "..." вложению отдельных аргументов.

  • Приведем простой пример: командная строка процесса, которая в конечном итоге должна быть запущена, должна выглядеть примерно так: обратите внимание на - неэкранированный - внешний "...", который включает в себя путь к пакетному файлу в двойных кавычках и все сквозные аргументы, которые могут быть индивидуально двойные кавычки:

    "C:\Windows\System32\cmd.exe" /c ""c:\path\to\my.cmd" -foo "bar""
    

Вот автономная и упрощенная демонстрация обходного пути, включающая случайные улучшения, предложенные Compo.

@echo off & setlocal enabledelayedexpansion

:: ...

:: Check for admin privileges
net sessions > nul 2>&1 || (
  choice /m "The execution needs elevated privileges"
  if !errorlevel! equ 1 (
        echo Relaunching with elevation and arguments and waiting for completion...
        start /b /wait "" PowerShell -NoProfile -Command "Start-Process -Wait -Verb RunAs cmd.exe -ArgumentList '/C \"\"%~f0\" %res% -ico \"%icon%\" -dir \"%directory%\"\"' %style%"
        exit /b
  ) else (
        echo Elevation request declined. >&2
        exit /b 1
  )
)

:: Getting here means that the batch file runs elevated.

echo Running elevated; args given: [%*]

pause

Это надежный ответ, и он сработал, спасибо за помощь

benznega 11.07.2024 18:31

Я рад это слышать, @Benznega; Не за что.

mklement0 11.07.2024 18:33

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