如何从batch file运行PowerShell脚本

我想在PowerShell中运行这个脚本。 我在桌面ps.ps1下面的脚本保存为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 

但是我得到这个错误:

在这里输入图像说明

您需要-ExecutionPolicy参数:

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

否则,PowerShell会将参数视为要执行的一行,而Set-ExecutionPolicy 一个cmdlet,它没有-File参数。

我解释了为什么要从batch file中调用PowerShell脚本,以及如何在我的博客文章中这样做。

这基本上是你在找什么:

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

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

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

不过,我build议将batch file和PowerShell脚本文件放在同一个目录中,而不是像我的博客文章所描述的那样对整个PowerShell脚本进行编码。

如果以pipe理员身份运行一个调用PowerShell的batch file,则最好像这样运行它,这样可以节省所有的麻烦:

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

最好使用Bypass

如果您想从当前目录运行而不具有完全限定的path,则可以使用:

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

如果要运行几个脚本,可以使用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