Como você passa “Program Files (x86)” para o Powershell?

4

Eu já li e tentei várias maneiras, mas isso não vai aguentar ... Eu até tentei escapar dos espaços e também tentar adicionar aspas extras (citações com escape) na frente do caminho. .

$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

Ele continua me dando isso:

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

Eu tentei com um caminho diferente, digamos C:\Blah\W T F , ainda haveria reclamações sobre os espaços que estão dentro de W T F .

Editar: Basicamente, eu precisava iniciar um elevated powershell e, em seguida, o CD em meu diretório para executar algum script de pós-instalação. Mas estou tendo um disco rígido no meu diretório, consegui iniciar meu powershell elevado, mas ele sempre vai para c:\windows\system32 .

Editar2:

$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

Editar3:

Eu tenho esse script chamada load-ems.ps1 (para carregar o Shell de Gerenciamento do Exchange) e estou tentando iniciar esse shell como elevado. Mas meu problema é que 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"
    
por codenamezero 24.07.2017 / 17:16

3 respostas

3

Você tem que colocar o argumento em CD entre aspas simples para preservar os espaços. Use Start-Process diretamente para evitar muita interpolação de variáveis:

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

Se é a troca 2013, você pode tentar:

$Credential = Get-Credential  
$Session = New-PSSession -ConfigurationName Microsoft.Exchange ' 
-ConnectionUri http://your.exchange.server/PowerShell/ -Credential $Credential
Import-PSSession $Session
    
por 25.07.2017 / 10:39
1

Com o comentário da @matandra eu modifiquei um pouco o meu script e consegui o que queria. Eu precisava incluir o caminho com ' aspas simples. Exemplo: "cd '$pwd'"

Eu também estou postando meu roteiro completo, espero que ele possa ajudar os outros. Agora posso encontrar e carregar o EMS, em seguida, executar quaisquer comandos adicionais que eu preciso. Chamar Load-EMS sem argumentos seria apenas carregar o EMS para você (programaticamente, independentemente de qual versão do Exchange Server está instalada, contanto que esteja instalada).

Sim, faz muito mais do que o que eu pedi originalmente , mas vendo isso é o superuser fórum, meu script pode ajudar os outros:

<#
.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
}
    
por 25.07.2017 / 18:21

Tags