2011-05-17 18 views
31

que tienen una secuencia de comandos PowerShell para agregar un sitio web a un Sitios de confianza en Internet Explorer:¿Cómo se ejecutan los comandos de powershell desde un archivo por lotes?

set-location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 
set-location ZoneMap\Domains 
new-item TESTSERVERNAME 
set-location TESTSERVERNAME 
new-itemproperty . -Name http -Value 2 -Type DWORD 

quiero para ejecutar estos comandos de PowerShell desde un archivo por lotes. Parece simple cuando tengo que ejecutar un solo comando, PERO en este caso tengo una secuencia de comandos relacionados. Quiero evitar crear un archivo separado para que se llame al script PS desde el lote; todo debe estar en el archivo por lotes.

La pregunta es: ¿Cómo ejecutar comandos (o declaraciones) de powershell desde un archivo por lotes?

+0

También vea ... http://stackoverflow.com/questions/2035193/how-to-run-a-powershell-script – SteveC

Respuesta

46

Esto es lo que el código se vería así en un archivo por lotes (probado, funciona):

powershell -Command "& {set-location 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'; set-location ZoneMap\Domains; new-item SERVERNAME; set-location SERVERNAME; new-itemproperty . -Name http -Value 2 -Type DWORD;}" 

Con base en la información de:

http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/

+2

cómo puedo dividir las líneas largas? líneas similares a tu ejemplo. – JuanPablo

6

Type en cmd.exe Powershell -Help y mira los ejemplos.

1

untested.cmd

;@echo off 
;Findstr -rbv ; %0 | powershell -c - 
;goto:sCode 

set-location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 
set-location ZoneMap\Domains 
new-item TESTSERVERNAME 
set-location TESTSERVERNAME 
new-itemproperty . -Name http -Value 2 -Type DWORD 

;:sCode 
;echo done 
;pause & goto :eof 
0

Buscando la posibilidad de poner un script de PowerShell en un archivo por lotes, he encontrado este hilo. La idea de walid2mi no funcionó al 100% para mi script. Pero a través de un archivo temporal, que contiene la secuencia de comandos funcionó. Aquí está el esqueleto del archivo por lotes:

;@echo off 
;setlocal ENABLEEXTENSIONS 
;rem make from X.bat a X.ps1 by removing all lines starting with ';' 
;Findstr -rbv "^[;]" %0 > %~dpn0.ps1 
;powershell -ExecutionPolicy Unrestricted -File %~dpn0.ps1 %* 
;del %~dpn0.ps1 
;endlocal 
;goto :EOF 
;rem Here start your power shell script. 
param(
    ,[switch]$help 
) 
0

Esta solución es similar a walid2mi (gracias por la inspiración), pero permite la entrada de la consola estándar mediante el cmdlet Read-Host.

pros:

  • se puede ejecutar como .cmd estándar
  • sólo un archivo de secuencia de comandos por lotes y PowerShell
  • script de PowerShell puede ser de varias líneas (fácil de leer la escritura)
  • permite la entrada de la consola estándar (use el cmdlet Read-Host de manera estándar)

contras:

  • requiere la versión powershell 2.0+

comentado y ejemplo runable de batch-PS-script.cmd:

<# : Begin batch (batch script is in commentary of powershell v2.0+) 
@echo off 
: Use local variables 
setlocal 
: Change current directory to script location - useful for including .ps1 files 
cd %~dp0 
: Invoke this file as powershell expression 
powershell -executionpolicy remotesigned -Command "Invoke-Expression $([System.IO.File]::ReadAllText('%~f0'))" 
: Restore environment variables present before setlocal and restore current directory 
endlocal 
: End batch - go to end of file 
goto:eof 
#> 
# here start your powershell script 

# example: include another .ps1 scripts (commented, for quick copy-paste and test run) 
#. ".\anotherScript.ps1" 

# example: standard input from console 
$variableInput = Read-Host "Continue? [Y/N]" 
if ($variableInput -ne "Y") { 
    Write-Host "Exit script..." 
    break 
} 

# example: call standard powershell command 
Get-Item . 

Fragmento para el archivo .cmd:

<# : batch script 
@echo off 
setlocal 
cd %~dp0 
powershell -executionpolicy remotesigned -Command "Invoke-Expression $([System.IO.File]::ReadAllText('%~f0'))" 
endlocal 
goto:eof 
#> 
# here write your powershell commands... 
Cuestiones relacionadas