wake-up-neo.com

Ausführen eines Powershell-Skripts über die Befehlszeile und Übergeben eines Verzeichnisses als Parameter

Mein Powershell-Skript, Foo.ps1:

Function Foo($directory)
{
    echo $directory
}

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

Über die Windows-Konsole:

powershell -command .\Foo.ps1

Ergebnis: "Der Begriff".\Foo.ps1 "wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie den Pfad, falls ein Pfad angegeben wurde ist richtig und versuchen Sie es erneut. "

Dies geschieht, obwohl sich Foo.ps1 im aktuellen Verzeichnis befindet, von dem aus ich Powershell anrufe. Ich habe dann versucht, es unter Angabe des vollständigen Pfads zur Skriptdatei aufzurufen. da dieser Pfad ein Leerzeichen enthält, glaube ich, muss ich es auf irgendeine Weise zitieren. Außerdem muss ich dem Skript ein Argument übergeben, das auch ein Dateiname ist, der ein oder mehrere Leerzeichen enthält. Egal was ich versuche, ich kann es nicht zum Laufen bringen. Dies ist meine bisherige Vermutung:

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

Womit der Fehler "Unerwartetes Token 'C:\Dummy Directory 2\File.txt' in Ausdruck oder Anweisung ausgegeben wird. In Zeile: 1 Zeichen: 136".

Edit: Ich habe herausgefunden warum

powershell -command .\Foo.ps1

funktioniert nicht. Dies lag daran, dass meine Microsoft.PowerShell_profile.ps1-Datei hatte

cd C: \

sobald Powershell gestartet wurde, änderte sich das Verzeichnis.

49
Polyfun

versuche dies:

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

sie rufen eine Skriptdatei und keinen Befehl auf, daher müssen Sie -file verwenden, zB:

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

für PS V2

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

(Überprüfen Sie das Ende dieser Technet-Seite http://technet.Microsoft.com/en-us/library/ee176949.aspx )

39
Loïc MICHEL

Mit der Flagge -Command Sie können Ihre gesamte Powershell-Zeile wie einen Befehl in der PowerShell-Eingabeaufforderung ausführen:

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

Dies löste mein Problem mit der Ausführung von PowerShell-Befehlen in Visual Studio-Ereignissen nach und vor der Erstellung.

17

Ändern Sie Ihren Code wie folgt:

Function Foo($directory)
    {
        echo $directory
    }

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

Und dann rufen Sie es auf als:

powershell -ExecutionPolicy RemoteSigned -Datei "c:\foo.ps1" "c:\Dokumente und Einstellungen" "c:\test"

2
Prasoon Dwivedi

Fügen Sie die Parameterdeklaration oben in die ps1-Datei ein

test.ps1

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

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

Ergebnis

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