2009-05-31 10 views
19

Ok coś tak prostego po prostu nie działa dla mnie. Dostałem cmdlet, który akceptuje pojedynczy parametr. Próbuję wywołać cmdlet w pliku wsadowym systemu Windows. Plik wsadowy zawiera:Wywoływanie poleceń cmdlet powershell z pliku wsadowego Windows

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 

Mój plik PS1 znowu nie robiąc nic szczególnego:

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 
    } 

Kiedy uruchomić plik bat to właśnie prowadzi do zakończenia (żadne komunikaty o błędach) i nie wydaje się utwórz plik temp.txt.

Mogę uruchomić plik poleceń powershell w wierszu polecenia PS, ale nie w cmd!

Ktoś ma jakieś pomysły, co może być nie tak?

Dzięki

+0

Johannes: cmd.exe to aplikacja Win32 (choć wiele osób wciąż uważa ją za DOS command.com). [Pytanie powinno zostać zredagowane] – grawity

+0

każde ostateczne rozwiązanie z pełnym kodem źródłowym na ten temat? – Kiquenet

Odpowiedz

0

Spróbuj zamiast składni:

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

dostałem tej pracy ... Plik PS1 nie muszą być zapakowane w funkcji. Właśnie ta deklaracja jest w porządku.

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

i plik bat nazywa to lubią:

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

To, na co natrafiłeś, to to, że skrypt definiował funkcję, ale jej nie wykonał. Możesz zadzwonić do funkcji na końcu skryptu lub nie zawinąć kodu w ogóle w funkcję (jak to robiłeś). – JasonMArcher

5

Problem jest w pliku ps1 - zadeklarować funkcję, ale nie nazwać. Zmodyfikuję go tak:

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 

to zadziała. Jednak nie jest to konieczne, można po prostu ommit deklarację funkcji i przenieść ciało do scenariusza samego:

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 

Połącz z wiersza poleceń:

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

Co jest mylące jest to, że jeśli skrypt znajduje się w ścieżce folderu zawierającej spacje, PowerShell nie rozpoznaje nazwy skryptu w cudzysłowie:

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

Ale można obejść stosując że coś takiego:

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

nie należy używać spacji w nazwie pliku .ps1, albo jesteś stąd szczęścia.

22

Począwszy PowerShell w wersji 2, można uruchomić skrypt PowerShell jak tak ...

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

Teraz, jeśli mogę tylko wymyślić sposób, aby obsłużyć dragging and dropping files to a Powershell script.

+0

Dziękuję bardzo, że to rozwiązało mój ból głowy i uniknąłem przekształcenia powershell w NSIS – CharlesB

7

Wyjaśniam, dlaczego warto wywołać skrypt PowerShell z pliku wsadowego i jak to zrobić: in my blog post here.

Jest to po prostu to, czego szukasz:

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

A jeśli trzeba uruchomić skrypt PowerShell jako administrator, użyj tego:

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

Zamiast sztywnego kodowania całej karty ścieżkę do skryptu PowerShell, zalecam umieszczenie pliku wsadowego i pliku skryptu PowerShell w tym samym katalogu, co opisano w moim blogu.

Powiązane problemy