如何从批处理文件运行PowerShell脚本


196

我正在尝试在PowerShell中运行此脚本。我将以下脚本另存为ps.ps1我的桌面。

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

我已经制作了一个批处理脚本来运行此PowerShell脚本

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

但我收到此错误:

在此处输入图片说明

Answers:


266

您需要-ExecutionPolicy参数:

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

否则,PowerShell 会将参数视为要执行的行,尽管Set-ExecutionPolicy 是cmdlet,但没有-File参数。


2
@joey它的工作谢谢..但是运行bat文件后,我收到此错误“ Waring:column'command'不适合显示并已删除”
Eka 2013年

那是警告,不是错误。还有更多关于另一个问题的主题。
乔伊

@joey为这个次要警告在stack.SE中编写另一个问题是否明智?
Eka

2
@Joey Haha,如此有效,您无需管理员即可覆盖此策略。那是安全问题吗?
Kolob Canyon'Nov

2
@KolobCanyon:如果您可以运行PowerShell,那么您还可以执行其他所有操作。请注意,执行策略并不意味着PowerShell具有比其他方式更多的特权。在某种程度上,这只是避免意外运行您可能不想运行的东西的一种便利。与必须在当前目录中的命令前面加上./Unix上的可执行标志相似。
乔伊,

116

在这里的博客文章中解释了为什么要从批处理文件调用PowerShell脚本,以及如何执行该脚本。

这基本上就是您要寻找的:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

如果您需要以管理员身份运行PowerShell脚本,请使用以下命令:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

我建议不要将批处理文件和PowerShell脚本文件放在我的博客文章描述的相同目录中,而不是硬编码PowerShell脚本的整个路径。


当我在cmd窗口中键入命令行时,Invoke-WebRequest可以正常工作,但是每当我从批处理文件中运行404时,它都会返回404。我正在尝试PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C:\_my\script.ics' -Verb RunAs}";or powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics",或在-ps1文件中使用-File选项进行更改,或(New-Object Net.WebClient).DownloadFile。有任何想法吗?
克里斯

尝试使用-ExecutionPolicy Unrestricted。我猜测“旁路”选项无法提供PowerShell网络访问权限。
致命狗2014年

1
@Belun参考的博客文章显示了如何将参数传递给脚本。
deadlydog '16

19

如果要从当前目录运行而没有完全限定的路径,则可以使用:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"

16

如果您以管理员身份运行一个名为PowerShell的批处理文件,则最好像这样运行它,从而省去了所有麻烦:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

最好使用Bypass...


3

如果要运行一些脚本,可以使用Set-executionpolicy -ExecutionPolicy Unrestricted,然后通过重置Set-executionpolicy -ExecutionPolicy Default

请注意,执行策略仅在开始执行时才被检查(或看起来如此),因此您可以在后台运行作业并立即重置执行策略。

# Check current setting
Get-ExecutionPolicy

# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es

Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com  | tee ping__google.com.txt  }

# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es

2

从批处理中执行ps脚本的另一种简便方法是,将其简单地合并在ECHO和重定向字符(>和>>)之间,例如:

@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"

最后一行删除创建的临时文件。


1

如果您的PowerShell登录脚本在2012年服务器上运行了5分钟(与我的情况相同),则服务器上存在GPO设置-“配置登录脚本延迟”默认设置为“未配置”,这将导致5分钟的延迟在运行登录脚本之前。


1

小样本测试

<# :
  @echo off
    powershell /nologo /noprofile /command ^
         "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.