Jak przekazać „Program Files (x86)” do PowerShell?

5

Przeczytałem już i wypróbowałem różne sposoby, ale to po prostu nie da rady ... Próbowałem nawet uciec ze spacji, a także próbowałem dodać dodatkowe cytaty (cytaty unikane) przed ścieżką ...

$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

Nadal daje mi to:

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

Próbowałem z inną ścieżką, powiedzmy C:\Blah\W T F, że nadal narzeka na przestrzenie w środku W T F.

Edycja: Zasadniczo musiałem uruchomić elevated powershellCD, a następnie CD do mojego katalogu, aby uruchomić skrypt poinstalacyjny. Ale mam ciężką płytę CD w moim katalogu, byłem w stanie uruchomić podwyższoną wersję PowerShell, ale zawsze tak jest c:\windows\system32.

Edycja2:

$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

Edycja3:

Mam to wywołanie skryptu load-ems.ps1 (w celu załadowania powłoki Exchange Management Shell) i próbuję uruchomić tę powłokę jako podniesioną. Ale moim problemem jest to, że 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"
nazwa_kodowa
źródło
próbowałeś & "C:\Program Files (x86)\W T F"?
Frank Thomas
tak,& : The term 'C:\Program Files (x86)\W T F' is not recognized as the name of a cmdlet,
codenamezero
Co to jest wersja PowerShell
kazaamjt
@kazaamjt Wersja 4, również zaktualizowałem moje oryginalne pytanie o informacje.
codenamezero
Użyj zmiennej środowiskowej jako $env:ProgramFiles(x86).
Biswapriyo

Odpowiedzi:

5

Musisz zawrzeć argument na dysku CD w pojedynczych cudzysłowach, aby zachować spacje. Użyj Start-Process bezpośrednio, aby uniknąć zbyt dużej interpolacji zmiennych:

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

Jeśli jest to wymiana 2013, możesz zamiast tego spróbować:

$Credential = Get-Credential  
$Session = New-PSSession -ConfigurationName Microsoft.Exchange ` 
-ConnectionUri http://your.exchange.server/PowerShell/ -Credential $Credential
Import-PSSession $Session
kazaamjt
źródło
1

Dzięki komentarzowi @matandra zmodyfikowałem trochę skrypt i dostałem to, czego chciałem. Musiałem zawinąć ścieżkę 'pojedynczym cytatem. Przykład:"cd '$pwd'"

Zamieszczam również cały skrypt, mając nadzieję, że może pomóc innym. Teraz mogę znaleźć i załadować EMS, a następnie wykonać wszelkie dodatkowe polecenia, których potrzebuję. Wywołanie Load-EMSbez argumentów po prostu załaduje dla ciebie EMS (programowo, niezależnie od tego, która wersja programu Exchange Server jest zainstalowana, o ile jest zainstalowana).

Tak, robi znacznie więcej niż pierwotnie prosiłem , ale widząc to superuserforum, mój skrypt może pomóc innym:

<#
.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
}
nazwa_kodowa
źródło