Você está lidando com análise de linha de comando múltipla aqui, é por isso que é difícil fazê-lo funcionar corretamente. Você precisa ter aspas em torno de seu caminho com espaços quando passou para o PowerShell (do arquivo bat) e quando passou de do Powershell (para o cmdlet Start-Process ). Isso significa algum escape sério:
- Remova a barra invertida arrastada do
%~dp0
, ou ele irá mexer com o escape em P.2 - Escove aspas com barra invertida (
\
) para o comandoSTART
devido à maneira como o C o analisador de linha de comando funciona :A double quotation mark preceded by a backslash, \",
is interpreted as a literal double quotation mark ("). -
Escove aspas no PowerShell ao usar
Start-Process
cmdlet-
Para o parâmetro
-File
:"'"$($MyInvocation.MyCommand.Path)'""
-
Para o argumento
$Loc
:"\'"$Loc\'""
-
O exemplo abaixo funciona para mim e mantém o caminho com espaços intactos enquanto se auto eleva.
Lançador de morcegos:
SETLOCAL EnableExtensions
:: Get current directory
SET current=%~dp0
:: Does "current" variable have a trailing slash? If so, remove it
IF %current:~-1%==\ SET current=%current:~,-1%
cd /d %current%
START /WAIT powershell.exe -ExecutionPolicy Bypass -File "JavaInstall.ps1" -Loc \""%current%\""
Código de elevação do PowerShell:
Param(
[string]$Loc
)
$Delay = 5
Write-Host "'$Loc argument: $Loc"
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole] 'Administrator')
)
{
Write-Host "Not elevated, restarting in $Delay seconds ..."
Start-Sleep -Seconds $Delay
$Arguments = @(
'-NoProfile',
'-NoExit',
'-File',
"'"$($MyInvocation.MyCommand.Path)'"",
"\'"$Loc\'""
)
Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Arguments
Break
}
else
{
Write-Host "Already elevated, exiting in $Delay seconds..."
Start-Sleep -Seconds $Delay
}