2009-05-31 1 views
19

Ok, qualcosa di così semplice non funziona per me. Ho ottenuto un cmdlet che accetta un singolo parametro. Sto cercando di chiamare un cmdlet all'interno di un file batch di Windows. Il file batch contiene:Chiamare i cmdlet di PowerShell dal file batch di 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 

Il mio file ps1 ancora una volta non fare nulla di speciale:

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 
    } 

Quando eseguo il file bat solo corre a compimento (nessun messaggio di errore) e non sembra crea il file temp.txt.

Posso eseguire il file di comando di PowerShell al prompt dei comandi di PS ma non in cmd!

Qualcuno ha qualche idea su cosa potrebbe essere sbagliato?

Grazie

+0

Johannes: cmd.exe è un'applicazione Win32 (sebbene molte persone lo considerino ancora come il comando DOS.com). [La domanda deve essere modificata] – grawity

+0

qualsiasi soluzione finale con codice sorgente completo su di esso? – Kiquenet

risposta

0

Prova questa sintassi invece:

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

Ho ottenuto questo lavoro ... Il file PS1 non ha bisogno di essere avvolto in una funzione. Solo questa dichiarazione è ok.

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

e il file bat chiama le cose come:

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

In questo caso, lo script stava definendo una funzione, ma non l'eseguiva. Potresti chiamare la funzione alla fine dello script, o non avvolgere il tuo codice in una funzione (come hai finito per farlo). – JasonMArcher

5

Il problema è nel file PS1 - si dichiara una funzione, ma non si chiami. vorrei modificarlo in questo modo:

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 

che funzionerà. Tuttavia, non è necessario, si può semplicemente ommit la dichiarazione di funzione e muovere il corpo in script stesso:

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 

chiamata dal prompt dei comandi:

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

Cosa c'è di confusione è che se lo script è in un percorso cartella contenente spazi, PowerShell non riconosce il nome dello script tra virgolette:

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

Ma si può andare in giro che l'utilizzo di qualcosa come:

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

Non utilizzare spazi nel nome del file ps1, o sei outta fortuna.

22

A partire dalla PowerShell versione 2, è possibile eseguire uno script PowerShell in questo modo ...

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

Ora, se ho potuto capire solo un modo per gestire dragging and dropping files to a Powershell script.

+0

Grazie mille per aver risolto il mio mal di testa ed evitato di convertire PowerShell in NSIS – CharlesB

7

Spiega entrambi i motivi per cui si desidera chiamare uno script PowerShell da un file batch e come farlo in my blog post here.

Questo è fondamentalmente quello che stai cercando:

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

E se è necessario eseguire lo script PowerShell come amministratore, utilizzare questo:

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

Invece di codificare l'intero Tuttavia, si consiglia di posizionare il file batch e il file di script di PowerShell nella stessa directory, come descritto nel post del blog.