3

Одна проблема ведет к другой! Справка пользователя просто исправила одну проблему, которая привела к другой, когда я продолжил работу над этим сценарием. Мой сценарий выполняет проверку, чтобы увидеть, является ли текущий пользователь администратором, следующим образом:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'" + $loc
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

Аргументом для $ loc является параметр, который первоначально был передан через командный файл, а именно:

@setlocal enableextensions
@cd /d "%~dp0"
SET current="%~dp0
START /WAIT powershell.exe -ExecutionPolicy Bypass -File "JavaInstall.ps1" -loc %current%

В верхней части файла Powershell мы имеем:

param(
[string]$loc
)

Это работает в двух условиях:

1) Пользователь уже является Администратором.
2) Папка, из которой она запускается в любой точке обхода, не имеет пробела.

Когда он запускается из папки, такой как: C:\Users\User\Desktop\Java Test, он внезапно завершается ошибкой. Если я напишу Host-Host по пути, я увижу, что переменная $ loc верна до момента повышения. После того, как он поднимется, все, что после пространства потеряно. Если я запускаю это непосредственно как администратор, это, конечно, обходит повышение прав и работает даже с пробелами в папках, но я не хочу требовать сценария запуска правой кнопкой мыши. Есть идеи, что может быть причиной потери текста после пробела во время возвышения?

1 ответ1

0

Здесь вы имеете дело с разбором нескольких командных строк, поэтому трудно заставить его работать должным образом. Вы должны иметь кавычки вокруг вашего пути с пробелами , когда он перешел к PowerShell (из файла летучей мыши) и , когда он проходил от Powershell (к Start-Process командлету). Это означает серьезное побег:

  1. Удалите обратную косую черту из %~dp0 , иначе он будет сбит с экранирования в P.2
  2. Избегайте кавычек с обратной косой чертой (\) для команды START из-за способа работы синтаксического анализатора командной строки C:

    Двойная кавычка, перед которой стоит обратная косая черта, \",
    интерпретируется как буквальная двойная кавычка (").

  3. Выход из кавычек в PowerShell при использовании командлета Start-Process

    1. Для параметра -File:

      "`"$($MyInvocation.MyCommand.Path)`""
      
    2. Для аргумента $Loc:

      "\`"$Loc\`""
      

Пример ниже работает для меня и сохраняет путь с пробелами нетронутыми при подъеме.

Летучая мышь:

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%\""

Код повышения 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
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .