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?
Est-ce que cela ferait ce que vous voulez?
& "C:\Windows Services\MyService.exe"
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
"&'C:\Windows Services\MyService.exe'" | Invoke-Expression
via https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html
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
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
Cela a fonctionné pour moi:
$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
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.
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"
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.
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
Veuillez utiliser cette simple doublure:
Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\Excel.EXE"