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.
versuche dies:
powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"
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 )
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.
Ä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"
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