How to execute PowerShell commands from a batch file?
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
)
Andrei
Updated on July 03, 2021Comments
-
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 over 10 yearshow I can split long lines ? lines similar to your example.
-
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 over 5 yearsUsage 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 thecd %~dp0
and changed the invoked expression to$($ScriptHome = '%~dp0'; [System.IO.File]::ReadAllText('%~dpf0'))
to handle this. -
Ali123 over 4 yearsIs it possible to pass multiple .ps1 files ?
-
Hassan Voyeau over 4 yearsCan you give an example? Sounds like another question.
-
Justin Goldberg about 3 yearsDo I include the # in my powershell commands?
-
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 over 2 yearsfor fun,
#!/bin/bash
powershell <<<'run this string'
works, but its so. slow.