script run para how ejemplos ejecutar crear bat powershell batch-file

run - Llamando a los cmdlets de powershell desde un archivo por lotes de Windows



run powershell script (6)

Ok, algo tan simple simplemente no funciona para mí. Tengo 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:

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 de nuevo no haciendo 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 bat, solo se ejecuta hasta completarlo (sin mensajes de error) y no parece que cree el archivo temp.txt.

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

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

Gracias


A partir de la versión 2 de Powershell, puede ejecutar un script de Powershell como ...

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

Ahora si solo pudiera encontrar una manera de manejar arrastrar y soltar archivos a un script de Powershell .


Conseguí este trabajo ... El archivo ps1 no necesita ser envuelto en una función. Sólo 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


El problema está en el archivo ps1: declara una función pero no la llama. Yo lo modificaría 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

funcionará. Sin embargo, no es necesario, simplemente puede omitir la declaración de la función y mover el cuerpo al propio script:

param($path) $tempfile = "C:/temp.txt" set-ExecutionPolicy Unrestricted get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode set-ExecutionPolicy Restricted


Explico por qué querría llamar a un script de PowerShell desde un archivo por lotes y cómo hacerlo en la publicación de mi blog aquí .

Esto es básicamente lo que estás buscando:

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

Y si necesita ejecutar su script de PowerShell como administrador, use 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}"

Sin embargo, en lugar de codificar la ruta completa al script de PowerShell, recomiendo colocar el archivo por lotes y el archivo de script de PowerShell en el mismo directorio, como lo describe mi publicación en el blog.


Pruebe esta sintaxis en su lugar:

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


# Test-Args.ps1 param($first, $second) write-host $first write-host $second

Llamar 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 puedes evitar 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 uses espacios en el nombre de tu archivo .PS1, o estás fuera de suerte.