5

Я уже читал и пробовал разные способы, но это не сработает ... Я даже пытался избежать пробелов, а также пытался добавить дополнительные кавычки (экранированные кавычки) перед путем ...

$cmd = 'powershell.exe'
$dir = 'C:\Program Files (x86)\W T F'
$inner = "-NoExit -Command cd $dir"
$arguments = "Start-Process powershell -ArgumentList '$inner' -Verb RunAs"
& $cmd $arguments

Это продолжает давать мне это:

x86 : The term 'x86' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:22
+ cd C:\Program Files (x86)\W T F
+                      ~~~
    + CategoryInfo          : ObjectNotFound: (x86:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Я пробовал с другим путем, скажем, C:\Blah\W T F он все равно будет жаловаться на пробелы, которые находятся внутри W T F .

Изменить: По сути, мне нужно было запустить elevated powershell а затем компакт-диск в мой каталог, чтобы запустить сценарий после установки. Но у меня есть трудный компакт-диск в мой каталог, я смог запустить мой повышенный PowerShell, но он всегда идет в c:\windows\system32 .

Edit2:

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.18728
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

Edit3:

У меня есть этот скрипт вызов load-ems.ps1 (для загрузки Exchange Management Shell), и я пытаюсь запустить эту оболочку с повышенными правами. Но моя проблема в том, что: 1) the shell would start in system32 and won't find my scripts , 2) if i try to CD to my directory, i can't.

. ".\find-exchange.ps1"

$remoteexchangeps1 = Find-Exchange
$commands = @(
    ". '$remoteexchangeps1';",
    "Connect-ExchangeServer -auto -ClientApplication:ManagementShell;",
    ".\plugin-reinstall.ps1;"
)

$command = @($commands | % {$_})
powershell.exe -noexit -command "$command"

3 ответа3

4

Вы должны заключить аргумент в CD в одинарные кавычки, чтобы сохранить пробелы. Используйте Start-Process напрямую, чтобы избежать слишком большой интерполяции переменных:

$cmd = 'powershell.exe'
$dir = 'C:\Program Files (x86)\W T F'
$inner = "-NoExit -Command cd '$dir'"
Start-Process $cmd -ArgumentList $inner -Verb RunAs
1

С комментарием @matandra я немного изменил свой сценарий и получил то, что хотел. Мне нужно было обернуть путь с ' одинарные кавычки. Пример: "cd '$pwd'"

Я также публикую свой полный сценарий, надеюсь, что он может помочь другим. Теперь я могу найти и загрузить EMS, а затем выполнить любые дополнительные команды, которые мне нужны. Вызов Load-EMS без аргументов просто загрузит EMS для вас (программно, независимо от того, какая версия Exchange Server установлена, если она установлена).

Да, это намного больше, чем я изначально просил, но, увидев это форум superuser , мой сценарий может помочь другим:

<#
.SYNOPSIS
Find the Microsoft Exchange that is installed on the current machine

.DESCRIPTION
The function will go through the Windows Registry and try to locate 
the latest installed Microsoft Exchange instances on the current machine,
then locate the RemoteExchange.ps1 powershell script and return its location.

.EXAMPLE
Find-Exchange
C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1
#>
function Find-Exchange() {
    $exchangeroot = "HKLM\SOFTWARE\Microsoft\ExchangeServer\"

    $allexchanges = Get-ChildItem -Path Registry::$exchangeroot -Name | Where-Object { $_ -match "^V.." }
    $sorted = $allexchanges | Sort-Object -descending

    If ($sorted.Count -gt 1) { $latest = $sorted[0] } Else { $latest = $sorted }

    $setup = $exchangeroot + $latest + "\Setup"

    $properties = Get-ItemProperty -Path Registry::$setup

    $installPath = $properties.MsiInstallPath

    $bin = $installPath + "bin"

    $remoteexchange = $bin + "\RemoteExchange.ps1"

    echo $remoteexchange
}

<#
.SYNOPSIS
Load Exchange Management Shell (EMS) and execute additional commands

.DESCRIPTION
The script loads the EMS and then execute commands you pass via $AdditionalCommands parameter

.EXAMPLE
Load-EMS -AdditionalCommands @("echo 'HELLO WORLD'", "Get-TransportAgent")  
#>
function Load-EMS($AdditionalCommands) {
    $pwd = (Get-Item -Path "." -verbose).FullName
    $remoteexchangeps1 = Find-Exchange

    # These commands are needed to load the EMS
    # We need to cd to the current directory because we will be starting a
    # brand new elevated powershell session, then we load the EMS script,
    # finally we connect to the exchange server after loading the EMS.
    [System.Collections.ArrayList] 
    $cmdchain = @(
        "cd '$pwd'"
        ". '$remoteexchangeps1'"
        "Connect-ExchangeServer -auto -ClientApplication:ManagementShell"
    )

    # We will also chain the commands passed by the user and run them too
    $cmdchain += $AdditionalCommands;

    # We combine all of the commands into a single line and pass it over
    # to the new elevated powershell session that we are about to launch
    $chained = @($cmdchain | % {"$_;"})
    $arguments = "-noexit -command $chained"

    # Launching the powershell
    Start-Process powershell.exe -Verb RunAs -ArgumentList $arguments
}
1

Если это обмен 2013, вы можете попробовать вместо этого:

$Credential = Get-Credential  
$Session = New-PSSession -ConfigurationName Microsoft.Exchange ` 
-ConnectionUri http://your.exchange.server/PowerShell/ -Credential $Credential
Import-PSSession $Session

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