web-dev-qa-db-fra.com

Comment exécuter un script Powershell à partir de la ligne de commande et passer un répertoire en tant que paramètre

Mon script Powershell, Foo.ps1:

Function Foo($directory)
{
    echo $directory
}

if ($args.Length -eq 0)
{
    echo "Usage: Foo <directory>"
}
else
{
    Foo($args[0])
}

Depuis la console Windows:

powershell -command .\Foo.ps1

Résultats en: "Le terme '.\Foo.ps1' n'est pas reconnu en tant que nom d'une applet de commande, fonction, fichier de script ou programme utilisable. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et essayez à nouveau. "

Ceci en dépit du fait que Foo.ps1 soit dans le répertoire en cours d'où j'appelle Powershell. J'ai ensuite essayé de l'appeler en spécifiant le chemin d'accès complet au fichier de script; parce que ce chemin contient un espace, je crois que je dois le citer en quelque sorte. De plus, je dois passer un argument au script, qui est également un nom de fichier contenant un ou plusieurs espaces. Peu importe ce que j'essaie, je ne peux pas le faire fonctionner. C'est ma meilleure estimation jusqu'à présent:

powershell -command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'"

Ce qui donne l'erreur "Jeton inattendu 'C:\Dummy Directory 2\File.txt' dans une expression ou une instruction. À la ligne: 1 caractère: 136".

Edit: j'ai compris pourquoi

powershell -command .\Foo.ps1

n'a pas fonctionné. C’est parce que mon fichier Microsoft.PowerShell_profile.ps1 avait

cd C: \

donc dès que PowerShell a démarré, il a changé de répertoire.

49
Polyfun

essaye ça:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"
38
CB.

vous appelez un fichier de script et non une commande, vous devez donc utiliser -file, par exemple:

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space"

pour PS V2

powershell.exe -noexit &'c:\my scripts\test.ps1'

(consultez le bas de cette page technique http://technet.Microsoft.com/en-us/library/ee176949.aspx )

39
Loïc MICHEL

En utilisant l'indicateur -Command, vous pouvez exécuter l'intégralité de votre ligne powershell comme s'il s'agissait d'une commande de l'invite PowerShell:

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'"

Cela a résolu mon problème avec l'exécution de commandes PowerShell dans les événements Visual Studio Post-Build et Pre-Build.

17
Tom 'Blue' Piddock

Changez votre code comme suit:

Function Foo($directory)
    {
        echo $directory
    }

    if ($args.Length -eq 0)
    {
        echo "Usage: Foo <directory>"
    }
    else
    {
        Foo([string[]]$args)
    }

Et invoquez le comme:

powershell -ExecutionPolicy RemoteSigned -File "c:\foo.ps1" "c:\Documents and Settings" "c:\test"

2
Prasoon Dwivedi

Ajouter le paramètre de décompression en haut du fichier ps1

test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

résultat

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
1
Hyundong Hwang