2012-12-05 7 views
29

Mein Powershell-Skript übergeben, Foo.ps1:Wie ein Powershell-Skript von der Kommandozeile ausführen und ein Verzeichnis als Parameter

Function Foo($directory) 
{ 
    echo $directory 
} 

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

in der Windows-Konsole:

powershell -command .\Foo.ps1 

Ergebnisse in: "Der Begriff '. \ Foo.ps1' wird nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie, ob der Pfad korrekt ist und ob ein Pfad enthalten ist Versuch es noch einmal."

Dies ist trotz Foo.ps1 im aktuellen Verzeichnis von wo ich Powershell aufrufen. Ich versuchte dann, es den vollständigen Pfad zu der Skriptdatei anzugeben; Da dieser Pfad ein Leerzeichen enthält, glaube ich, dass ich es in irgendeiner Weise zitieren muss. 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 zur Arbeit bringen. Das ist meine beste Vermutung bisher:

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

, die den Fehler verursacht "Unerwarteter Token. 'C: \ Dummy-Verzeichnis 2 \ File.txt' in Ausdruck oder Anweisung Bei Zeile: 1 Zeichen: 136".

Edit: Ich habe gearbeitet, warum

powershell -command .\Foo.ps1 

nicht funktionierte. Das war, weil meine Microsoft.PowerShell_profile.ps1 Datei

cd C hatte: \

so sobald Powershell wurde Anfahren es ändert Verzeichnis.

+1

Sie auch -noprofile verwenden können, wenn Sie Powershell aufrufen aus der cmd. – user467384

Antwort

26

versuchen Sie dies:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'" 
+0

@ShellShock Ich habe meine Antwort bearbeiten, um die '.' (Dot sourcing) zu entfernen, weil in diesem Fall nutzlos ist. –

+1

Es; s funktioniert nicht: Bitte folgen Sie meinem neuesten Kommentar auf: http://StackOverflow.com/Questions/20804065/calling-powershell-Function-from-Command-Line/20804221?noredirect=1#Comment48796361_20804221 –

+0

@ ch.smrutiranjanparida Tut mir leid, aber ich verstehe nicht, was nicht funktioniert. Vermeiden Sie Kommentare zum Coding-Problem und veröffentlichen Sie eine neue Frage mit detaillierten Informationen zu Ihrem Fehler. Viel Glück! –

26

Sie fordern eine Skriptdatei kein Befehl, so dass Sie -datei zB verwenden:

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 die Unterseite dieser Technet-Seite http://technet.microsoft.com/en-us/library/ee176949.aspx)

+3

Der erste Befehl funktioniert auch in V2. –

+0

Vielen Dank für die Genauigkeit –

+0

Die Windows PowerShell 1.0-Bedienungsanleitung wurde zurückgezogen. Den aktuellsten Windows PowerShell-Inhalt finden Sie unter https://msdn.microsoft.com/en-au/powershell/scripting/core-powershell/console/powershell.exe-command-line-help#-file -dateipfad-Parameter –

2

Ihr Code wie folgt ändern:

Function Foo($directory) 
    { 
     echo $directory 
    } 

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

Und dann rufen Sie es wie:

Power -ExecutionPolicy RemoteSigned -Datei "c: \ foo.ps1" „c: \ Dokumente und Einstellungen“‚c: \ test‘

14

die Flagge mit -Command Sie Ihre gesamten Power Linie ausführen können, als ob es ein Befehl in der Powershell-Eingabeaufforderung war:

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

Dies löste mein Problem mit dem Ausführen von PowerShell-Befehlen in Visual Studio Post-Build- und Pre-Build-Ereignissen.

2

Fügen Sie den param declation an der Spitze der 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) 

Ergebnisdatei

C:\temp> .\test.ps1 -Encoding ASCII 
Encoding : ASCII