Проблема в том, что '-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"
Или когда я конвертирую его в исполняемый файл, он работает
Я не знаю, почему это происходит, возможно, глюк или что-то в этом роде. Я надеюсь, что кто-то найдет решение
@KenWhite, хотя некоторые из исходных тегов определенно неприменимы, batch-file
действительно применим, поэтому я восстановил его: вы также должны удовлетворять синтаксису (пакетного файла) требованиям cmd.exe
, а не только PowerShell, то есть среде, в которой работает PowerShell. CLI вызывается из дел.
@KenWhite: Ваш комментарий не касается моего отзыва, суть которого такова: здесь нужно учитывать два языка, поэтому оба тега подходят. Я пометил ваши действия для вмешательства модератора в виде вашего последнего комментария.
@KenWhite :: Check for admin privilage
— это определенно пакетный комментарий. То же самое с if !errorlevel! neq 0 ()
, set /p
, start /b
или !errorlevel!
, которые являются командами cmd. ОП вызывает PowerShell из cmd, но это не означает, что единственным языком здесь является PowerShell. Кто сказал, что в пакетной части не будет ошибок?
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
.
Мой общий совет: избегайте всего Экранирования двойных кавычек в пакетном скрипте , поместив все под капот PowerShell: например. создав самоподнимающийся скрипт PowerShell
@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
используется со списком аргументов, содержащим `\`.
@mklement0, мой комментарий кажется неверным. Похоже, проблема у -Verb RunAs
НЕ в обратной косой черте, а в двойных кавычках.
Проясним это: вы пытаетесь создать самоподнимающийся пакетный файл, то есть тот, который повторно вызывает себя с повышенными (административными) привилегиями при передаче аргументов.
Похоже, вы столкнулись с ошибкой, из-за которой повторный вызов пакетного файла с аргументами, заключенными в "..."
, синтаксически прерывает вызов целевого процесса, когда повышение прав запрашивается через 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; Не за что.
Пожалуйста, не отмечайте спам. PowerShell не является пакетным файлом Windows, пакетом Spring или любым другим добавленным вами пакетным тегом, и то, что в тегах есть слово «пакетный», не означает, что они примерно одинаковы. Ваш вопрос конкретно касается PowerShell, и это единственный тег, который применим к вашему вопросу. Остальные неуместные теги я удалил. Спам-тег — очень хороший способ быстро собрать отрицательные голоса и закрыть свой вопрос. Теги здесь имеют отношение и значение — используйте их правильно.