2009-05-31 19 views
19

Ok algo tan simple simplemente no funciona para mí. Obtuve un cmdlet que acepta un solo parámetro. Estoy intentando llamar a un cmdlet dentro de un archivo por lotes de Windows. El archivo por lotes contiene:Llamando cmdlets de powershell desde el archivo por lotes de 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 

Mi archivo PS1 nuevo no hacer nada especial:

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 
    } 

Cuando ejecuto el archivo del palo que sólo ejecuta hasta el final (no hay mensajes de error) y no parece crea el archivo temp.txt

¡Puedo ejecutar el archivo de comando de powershell en el símbolo del sistema de PS pero no en cmd!

¿Alguien tiene alguna idea de lo que podría estar mal?

Gracias

+0

Johannes: cmd.exe es una aplicación Win32 (aunque muchas personas todavía piensan en ello como el comando DOS). [La pregunta debe ser editada] – grawity

+0

¿alguna solución final con el código fuente completo al respecto? – Kiquenet

Respuesta

0

Prueba este lugar sintaxis:

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

Tengo este trabajo ... no necesitan ser envueltos en una función El archivo PS1. Solo esta declaración está bien.

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

y el archivo bat lo llama como:

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

Lo que se encontró es que el script estaba definiendo una función, pero no la estaba ejecutando. Puede llamar a la función al final del script o no ajustar el código en una función (como lo hizo). – JasonMArcher

5

El problema está en el archivo PS1 - se declara una función, pero no se llama a ella. Me modificarlo así:

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 

que va a funcionar. Sin embargo, no se necesita, sólo tiene que ommit la declaración de función y mover el cuerpo en el propio guión:

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 

llamada desde el símbolo del sistema:

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

Lo que es confuso es que si el script está en una ruta de carpeta que contiene espacios, PowerShell no reconoce el nombre del script entre comillas:

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

Pero se puede conseguir alrededor de eso usando algo como:

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

No utilice espacios en su .ps1 o Estás fuera de suerte.

22

A partir de Powershell versión 2, se puede ejecutar un script de PowerShell como tal ...

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

Ahora si sólo pudiera encontrar una manera de manejar dragging and dropping files to a Powershell script.

+0

Muchas gracias, esto resolvió mi dolor de cabeza y evitó convertir powershell en NSIS – CharlesB

7

Explica por qué desea llamar a un script de PowerShell desde un archivo por lotes y cómo hacerlo in my blog post here.

Esto es básicamente lo que busca:

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

Y si necesita ejecutar el script de PowerShell como administrador, utilice esto:

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

En lugar de la codificación dura toda la ruta de acceso al script de PowerShell, recomiendo colocar el archivo por lotes y el archivo de comandos de PowerShell en el mismo directorio, como describe mi publicación en el blog.

Cuestiones relacionadas