使用Perl检查已安装的Powershell模块



长话短说我使用多个版本的pc和Powershell版本,我需要在机器自动化时安装更新。我有一个脚本,在windows 10机器上安装一个模块,并在其他机器上安装模块。我想检查所需的模块是否安装和导入,但我是perl的新手,找不到任何东西。

print "Installing new updatesn";
my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion();
if($major == 10 )
{
my $ps_path = 'C:WINDOWSsystem32windowspowershellv1.0powershell.exe';
system("$ps_path -command Set-ExecutionPolicy RemoteSigned -force");
system("$ps_path -command Install-Module PSWindowsUpdate -force");
system("$ps_path -command Import-Module PSWindowsUpdate -force");
system("$ps_path -command Get-WindowsUpdate -Install -AcceptAll");
system("$ps_path -command Set-ExecutionPolicy Default -force");
}
else
{
system("$gRootDir\Tools\WUInstall.exe /install");
} 

使用单个system()调用:

system("
$ps_path -NoProfile -ExecutionPolicy RemoteSigned -Command "
\$ErrorActionPreference = 'Stop'
Install-Module PSWindowsUpdate -force
Import-Module PSWindowsUpdate -force
Get-WindowsUpdate -Install -AcceptAll
"
");

注意:

  • system()将所有输出流传递到终端(控制台)。

    • 作为题外话:不幸的是,PowerShell甚至通过stdout报告错误消息,尽管您可以有选择地使用2>重定向捕获它们-参见此答案的底部部分。
  • 您可以检查$? >> 8的退出代码,虽然在失败的情况下,它将始终是1在这种情况下。

  • PowerShell CLI参数:

    • -NoProfile防止不必要的加载PowerShell配置文件,这些配置文件通常只需要交互式会话。

    • -ExecutionPolicy RemoteSigned仅更改此调用(进程)的执行策略,从而避免了稍后恢复策略的需要。

  • $ErrorActionPreference = 'Stop'告诉PowerShell在发生错误时中止处理。在CLI调用的上下文中,这转换为进程退出代码1

最新更新