web-dev-qa-db-fra.com

Comment exécuter un script PowerShell avec des espaces blancs dans le chemin à partir de la ligne de commande?

J'ai donc essayé un tas de façons différentes d'exécuter un script PowerShell à partir de la ligne de commande et chacune renvoie une erreur.

Voici ce chemin:

C:\Users\test\Documents\test\line space\PS Script\test.ps1

J'ai essayé ces derniers:

powershell -File '"C:\Users\test\Documents\test\line space\PS Script\test.ps1"'

powershell "& ""C:\Users\test\Documents\test\line space\PS Script\test.ps1"""

Powershell "& 'C:\Users\test\Documents\test\line space\PS Script\test.ps1'"

Powershell -File 'C:\Users\test\Documents\test\line space\PS Script\test.ps1'"

Je reçois toutes ces erreurs:

&: Le terme "C:\Users\test\Documents\test\line space\PS Script \" n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme exploitable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

Échec du traitement du fichier '' C:\Users\test\Documents\test\line space\PS Script\'': le format du chemin indiqué n'est pas pris en charge. Spécifiez un chemin d'accès valide pour le paramètre -File.

Toute aide serait grandement appréciée!

9
Awsmike

Dans vos exemples, vous mélangez des devis et des devis doubles sans raison.

IF EXIST "C:\Users\test\Documents\test\line space\PS Script\test.ps1" (
  powershell -ExecutionPolicy Unrestricted -File "C:\Users\test\Documents\test\line space\PS Script\test.ps1"
)
3
TheIncorrigible1

-File Paramètre

Si vous souhaitez exécuter powershell.exe -File à partir de la ligne de commande, vous devez toujours définir des chemins avec des espaces dans doubleqoutes ("). Guillemets simples (') ne sont reconnus que par PowerShell. Mais comme powershell.exe est appelé (et donc le paramètre de fichier traité) par la ligne de commande, vous devez utiliser ".

powershell.exe -File "C:\Users\test\Documents\Test Space\test.ps1" -ExecutionPolicy Bypass

-Command Paramètre

Si vous utilisez le -Command paramètre, au lieu de -File, le -Command le contenu est traité par PowerShell, vous pouvez donc - et dans ce cas devez - utiliser ' à l'intérieur ".

powershell.exe -Command "& 'C:\Users\test\Documents\Test Space\test.ps1'" -ExecutionPolicy Bypass

Les guillemets doubles sont traités par la ligne de commande et & 'C:\Users\test\Documents\Test Space\test.ps1' est une commande qui est réellement traitée par PowerShell.

La solution 1 est évidemment plus simple.

Notez que -Command est également le paramètre par défaut utilisé, si vous n'en spécifiez aucun.

powershell.exe "& 'C:\Users\test\Documents\Test Space\test.ps1'" -ExecutionPolicy Bypass

Cela fonctionnerait aussi.

-EncodedCommand Paramètre

Vous pouvez encoder votre commande en Base64. Cela résout de nombreux problèmes de "citation" et est parfois (mais pas dans votre cas) le seul moyen possible.

Vous devez d'abord créer la commande encodée

$Command = "& 'C:\Users\test\Documents\Test Space\test.ps1'" 
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($Command))

Et puis vous pouvez utiliser le -EncodedCommand paramètre comme celui-ci

powershell.exe -EncodedCommand JgAgACcAQwA6AFwAVQBzAGUAcgBzAFwAdABlAHMAdABcAEQAbwBjAHUAbQBlAG4AdABzAFwAVABlAHMAdAAgAFMAcABhAGMAZQBcAHQAZQBzAHQALgBwAHMAMQAnAA== -ExecutionPolicy Bypass
20
vrdse

Essaye ça:

PS C:\> & "C:\Users\test\Documents\test\line space\PS Script\test"
3
C.Hennessey