web-dev-qa-db-fra.com

Les espaces provoquent une scission dans le chemin avec PowerShell

J'ai un problème avec powershell lorsque j'invoque un exe sur un chemin contenant des espaces.

PS C:\Services Windows> invoke-expression "C:\Services Windows\MyService.exe"

Le terme 'C:\Windows' n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme utilisable. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

Il semble y avoir une division entre "Windows" et "Services". Une idée de comment contourner ce problème?

31
jaffa

Est-ce que cela ferait ce que vous voulez?

& "C:\Windows Services\MyService.exe"
46
Adil Hindistan

Vous pouvez échapper à l'espace en utilisant des guillemets simples et un backtick avant l'espace:

$path = 'C:\Windows Services\MyService.exe'
$path -replace ' ', '` '
invoke-expression $path
16
Anthony Neace
"&'C:\Windows Services\MyService.exe'" | Invoke-Expression

via https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html

8
Alan

Je ne sais pas si quelqu'un en a toujours besoin ... J'avais besoin d'invoquer msbuild dans Powershell et le suivant a bien fonctionné:

$MSBuild = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe"

& $MSBuild $PathToSolution /p:OutDir=$OutDirVar /t:Rebuild /p:Configuration=Release
5
Jacek Plesnar

J'ai utilisé un hack depuis que Invoke-Expression fonctionne très bien pour moi.

Vous pouvez définir l'emplacement actuel sur le chemin d'accès avec des espaces, appeler l'expression, revenir à votre emplacement précédent et continuer:

$currLocation = Get-Location
Set-Location = "C:\Windows Services\"
Invoke-Expression ".\MyService.exe"
Set-Location $currLocation

Cela ne fonctionnera que si le fichier exe n'a aucun espace dans son nom.

J'espère que cela t'aides

3
c-chavez

Cela a fonctionné pour moi:

$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
3
J. Fischlein

En utilisant Powershell sur Windows 10 en 2018, ce qui a bien fonctionné pour moi était tout simplement de remplacer les guillemets doubles " par des guillemets simples '. L'ajout du backtick avant l'espace, comme suggéré dans une réponse, a cassé le chemin.

2
seinecle

Pour tout chemin de fichier avec de l’espace, mettez-le simplement entre guillemets, cela fonctionnera dans Windows Powershell. Par exemple, si vous souhaitez accéder au répertoire Program Files au lieu de l’utiliser

PS C:\> cd Program Files

qui provoquera une erreur, utilisez simplement ce qui suit résoudra le problème:

PS C:\> cd "Program Files"
0
CathyQian

Essayez ceci, simple et sans trop de changements:

invoke-expression "'C:\Windows Services\MyService.exe'"

en utilisant des citations simples au début et à la fin du chemin.

0
djsp

Peut utiliser l'opérateur de point ..

. "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"

ou la commande Start-Process

Start-Process -PSPath "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"

ou en utilisant ProcessStartInfo et Process

$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = 'C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe'
if($Admin){ $ProcessInfo.Verb = 'runas' }
$ProcessInfo.UseShellExecute = $false

$CommandParameters = '-noexit -noprofile -command Set-Location -LiteralPath c:\; $Host.ui.RawUI.WindowTitle = ''[{0}] PS''; Set-PSReadlineOption -HistorySaveStyle SaveNothing;' -f $Cred.UserName
$ProcessInfo.Arguments = $CommandParameters
$ProcessInfo.Domain = ($Cred.UserName -split '\\')[0]
$ProcessInfo.UserName = ($Cred.UserName -split '\\')[1]
$ProcessInfo.Password = $Cred.Password

$ProcessObject = New-Object -TypeName System.Diagnostics.Process
$ProcessObject.StartInfo = $ProcessInfo
$ProcessObject.Start() | Out-Null
0
jkdba

Veuillez utiliser cette simple doublure:

Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\Excel.EXE"
0
pramod