我试图在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

但是我得到这个错误:


当前回答

如果您的PowerShell登录脚本在2012服务器上运行5分钟后(就像我的一样),服务器上有一个GPO设置-“配置登录脚本延迟”,默认设置“未配置”,这将在运行登录脚本之前留下5分钟的延迟。

其他回答

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

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

最好使用旁路…

在我的博客文章中,我解释了为什么要从批处理文件调用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脚本文件放在同一个目录中,正如我的博客文章所描述的那样。

如果您的PowerShell登录脚本在2012服务器上运行5分钟后(就像我的一样),服务器上有一个GPO设置-“配置登录脚本延迟”,默认设置“未配置”,这将在运行登录脚本之前留下5分钟的延迟。

从批处理中执行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"

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

如果你想在没有完全限定路径的情况下从当前目录运行,你可以使用:

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