2009-05-31 6 views
19

Ok, etwas so einfaches funktioniert einfach nicht für mich. Ich habe ein Cmdlet, das einen einzelnen Parameter akzeptiert. Ich versuche, ein Cmdlet in einer Windows-Stapeldatei aufzurufen. Die Batch-Datei enthält:Aufruf von Powershell-Cmdlets aus der Windows-Stapeldatei

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 
powershell Set-ExecutionPolicy Restricted 
pause 

Meine ps1-Datei wieder nichts zu tun Besonderes:

function convert-utf8-to-utf16 { 
    $tempfile = "C:\temp.txt" 
    set-ExecutionPolicy Unrestricted 
    get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
    set-ExecutionPolicy Restricted 
    } 

Wenn ich die bat-Datei ausführen es läuft nur bis zum Abschluss (keine Fehlermeldungen), und es scheint nicht zu Erstellen Sie die Datei temp.txt.

Ich kann die Powershell-Befehlsdatei an der PS-Eingabeaufforderung ausführen, aber nicht in cmd!

Wer hat irgendwelche Ideen, was könnte falsch sein?

Dank

+0

Johannes: cmd.exe ist eine Win32-Anwendung (obwohl viele Leute es immer noch als DOS-Befehl.com denken). [Die Frage sollte bearbeitet werden] – grawity

+0

jede endgültige Lösung mit dem vollständigen Quellcode darüber? – Kiquenet

Antwort

0

diese Syntax Versuchen Sie stattdessen:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell {Set-ExecutionPolicy Unrestricted} 
powershell "& C:\convert-utf8-to-utf16.ps1 C:\test.txt" 
powershell {Set-ExecutionPolicy Restricted} 
pause 
1

Ich habe diese Arbeit ... Die ps1 Datei muss nicht in eine Funktion zu umwickeln. Nur diese Erklärung ist in Ordnung.

$tempfile = "C:\temp.txt" 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding unicode  

und die bat-Datei nennt es mag:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0 
powershell Set-ExecutionPolicy Unrestricted 
powershell "& 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 'C:\test.txt'" 
powershell Set-ExecutionPolicy Restricted 
pause 
+0

Sie haben herausgefunden, dass das Skript eine Funktion definiert, aber nicht ausführt. Sie könnten entweder die Funktion am Ende des Skripts aufrufen oder Ihren Code gar nicht in eine Funktion einfügen (wie Sie es zuletzt getan haben). – JasonMArcher

5

Das Problem in der ps1-Datei - Sie deklarieren eine Funktion, aber sie nennen es nicht. Ich würde es so ändern:

param($path) 
function convert-utf8-to-utf16 { 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
} 

convert-utf8-to-utf16 $path 

es funktionieren wird. Es ist jedoch nicht erforderlich, können Sie einfach ommit die Funktionsdeklaration und bewegen den Körper in das Skript selbst:

param($path) 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
3
# Test-Args.ps1 
param($first, $second) 
write-host $first 
write-host $second 

Aufruf von Eingabeaufforderung:

PowerShell.exe -NoProfile -Command "& {./Test-Args.ps1 'C:\Folder A\One' 'C:\Folder B\Two'}" 

Was verwirrend ist, dass wenn Das Skript befindet sich in einem Ordnerpfad mit Leerzeichen. PowerShell erkennt den Skriptnamen nicht in Anführungszeichen.

Sie können aber, dass wie mit so etwas umgehen:

PowerShell.exe -NoProfile -Command "& {set-location 'C:\Folder X';./Test-Args.ps1 'C:\Folder 
A\One' 'C:\Folder B\Two'}" 

keine Leerzeichen in Ihrem .ps1 Dateinamen verwenden, oder Sie sind outta Glück.

22

Beginnend mit Powershell Version 2 können Sie eine Powershell-Skript wie so laufen ...

powershell -ExecutionPolicy RemoteSigned -File "C:\Path\Script.ps1" "Parameter with spaces" Parameter2 

Nun, wenn ich nur einen Weg finden könnte dragging and dropping files to a Powershell script zu behandeln.

+0

Vielen Dank, das hat meine Kopfschmerzen gelöst und vermieden, Powershell zu NSIS zu konvertieren – CharlesB

7

Ich erkläre beide, warum Sie ein PowerShell-Skript aus einer Batch-Datei aufrufen und wie es geht in my blog post here.

Dies ist im Grunde, was Sie suchen:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\convert-utf8-to-utf16.ps1' 'C:\test.txt'" 

Und wenn Sie diese benötigen, um Ihre Powershell-Skript als Administrator ausführen, verwenden:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\convert-utf8-to-utf16.ps1"" ""C:\test.txt""' -Verb RunAs}" 

Anstatt Hartcodierung die gesamte Pfad zum PowerShell-Skript, empfehle ich jedoch, die Batch-Datei und die PowerShell-Skriptdatei im selben Verzeichnis zu platzieren, wie in meinem Blogbeitrag beschrieben.

Verwandte Themen