How to execute PowerShell commands from a batch file?

218,212

Solution 1

This is what the code would look like in a batch file(tested, works):

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;}"

Based on the information from:

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

Solution 2

Type in cmd.exe Powershell -Help and see the examples.

Solution 3

This solution is similar to walid2mi (thank you for inspiration), but allows the standard console input by the Read-Host cmdlet.

pros:

  • can be run like standard .cmd file
  • only one file for batch and powershell script
  • powershell script may be multi-line (easy to read script)
  • allows the standard console input (use the Read-Host cmdlet by standard way)

cons:

  • requires powershell version 2.0+

Commented and runable example of 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 .

Snippet for .cmd file:

<# : 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...

Solution 4

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

Solution 5

Looking for the possibility to put a powershell script into a batch file, I found this thread. The idea of walid2mi did not worked 100% for my script. But via a temporary file, containing the script it worked out. Here is the skeleton of the batch file:

;@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
)
Share:
218,212
Andrei
Author by

Andrei

Updated on July 03, 2021

Comments

  • Andrei
    Andrei almost 3 years

    I have a PowerShell script to add a website to a Trusted Sites in Internet Explorer:

    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
    

    I want to execute these PowerShell commands from a batch file. It seems simple when I have to run a single command, BUT in this case I have a sequence of related commands. I want to avoid creating a separate file for the PS script to be called from the batch - everything must be in the batch file.

    The question is: How to execute PowerShell commands (or statements) from a batch file?

  • JuanPablo
    JuanPablo over 10 years
    how I can split long lines ? lines similar to your example.
  • Hassan Voyeau
    Hassan Voyeau almost 6 years
    @JuanPablo Sorry for VERY late reply but only today made a commitment to review my stackoverflow usage and be more active. Did you get this answered?
  • Tydaeus
    Tydaeus over 5 years
    Usage note: there are some edge cases where cd %~dp0 won't work, and this style of invocation will set $PSScriptRoot to null, because we're running as a series of commands instead of as a script. I've dropped the cd %~dp0 and changed the invoked expression to $($ScriptHome = '%~dp0'; [System.IO.File]::ReadAllText('%~dpf0')) to handle this.
  • Ali123
    Ali123 over 4 years
    Is it possible to pass multiple .ps1 files ?
  • Hassan Voyeau
    Hassan Voyeau over 4 years
    Can you give an example? Sounds like another question.
  • Justin Goldberg
    Justin Goldberg about 3 years
    Do I include the # in my powershell commands?
  • kapitanrum
    kapitanrum about 3 years
    @JustinGoldberg - <# comment block for powershell #> - in this comment block is .bat/.cmd commands for powershell run, and after that comment block you can use any powershell syntax with a # :)
  • ThorSummoner
    ThorSummoner over 2 years
    for fun, #!/bin/bash powershell <<<'run this string' works, but its so. slow.