batch-file
Archivos por lotes e híbridos Powershell
Buscar..
Ejecutar Powershell con archivos temporales
Esto ha sido mencionado en otros temas híbridos una y otra vez. El método de la vieja escuela, pero fácil de ejecutar Powershell es por:
-
echo
del script Powershell en un script temporal - Ejecutar el script temporal
- Opcionalmente eliminar el script temporal.
Este es un script de ejemplo.
@echo off
echo powershell-command>Temp.ps1
echo another line>>Temp.ps1
rem echo the script into a temporary file
powershell -File Temp.ps1
rem execute the temporary script
del Temp.ps1
rem Optionally remove the temporary script
El método anterior requiere toneladas de declaraciones de echo
si se requiere un script largo, aquí hay un mejor método sugerido por @Aacini
@echo off
setlocal
rem Get the number of the "<resource>" line
for /F "delims=:" %%a in ('findstr /N "<resource>" "%~F0"') do set "start=%%a"
rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > Temp.ps1
powershell -File Temp.ps1
del /f /s /q Temp.ps1
goto :EOF
<resource>
PS
Powershell script
Use el comando POWERSHELL para ejecutar el comando Powershell de 1 línea
Usando el comando POWERSHELL
, podemos ejecutar un comando de 1 línea directamente desde un script por lotes, sin ningún archivo temporal.
Aquí está la sintaxis.
powershell.exe -Command <yourPowershellCommandHere>
También es posible que desee incluir otras banderas, como -Nologo
para mejorar el resultado real.
Powershell / batch híbrido sin archivos temporales
Este es el enfoque propuesto por el usuario rojo de stackoverflow que también puede manejar los argumentos de la línea de comando:
<# : batch portion
@echo off & setlocal
(for %%I in ("%~f0";%*) do @echo(%%~I) | ^
powershell -noprofile "$argv = $input | ?{$_}; iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin powershell #>
"Result:"
$argv | %{ "`$argv[{0}]: $_" -f $i++ }
llamado así:
psbatch.bat arg1 "Esto es arg2" arg3
Producirá:
Result:
$argv[0]: C:\Users\rojo\Desktop\test.bat
$argv[1]: arg1
$argv[2]: This is arg2
$argv[3]: arg3