Powershell 脚本仅在50-60%的时间内成功运行

Powershell 脚本仅在50-60%的时间内成功运行,powershell,Powershell,我正在通过我们的管理软件向组织中的计算机发送zip和powershell脚本,然后通过命令提示符执行powershell脚本。该脚本解压文件夹,安装程序并向注册表添加一些注册表项 如果计算机没有说某个策略正在阻止脚本的执行,那么它将按预期运行,安装程序并导入注册表项。但是,如果它确实发出警告,并且我将策略设置为unrestricted,则会出现以下错误。我使用的是Windows 8.1和Powershell 4.0 Id not be found. At C:\Temp\tps1.ps1:5 c

我正在通过我们的管理软件向组织中的计算机发送zip和powershell脚本,然后通过命令提示符执行powershell脚本。该脚本解压文件夹,安装程序并向注册表添加一些注册表项

如果计算机没有说某个策略正在阻止脚本的执行,那么它将按预期运行,安装程序并导入注册表项。但是,如果它确实发出警告,并且我将策略设置为unrestricted,则会出现以下错误。我使用的是Windows 8.1和Powershell 4.0

Id not be found.
At C:\Temp\tps1.ps1:5 char:9
+ Add-Type <<<< -assembly "system.io.compression.filesystem"
+ CategoryInfo : ObjectNotFound: (system.io.compression.filesyste
m:String) [Add-Type], Exception
+ FullyQualifiedErrorId : ASSEMBLY_NOT_FOUND,Microsoft.PowerShell.Commands
.AddTypeCommand

Add-Type : Cannot add type. One or more required assemblies are missing.
At C:\Temp\tps1.ps1:5 char:9
+ Add-Type <<<< -assembly "system.io.compression.filesystem"
+ CategoryInfo : InvalidData: (:) [Add-Type], InvalidOperationExc
eption
+ FullyQualifiedErrorId : ASSEMBLY_LOAD_ERRORS,Microsoft.PowerShell.Comman
ds.AddTypeCommand

Unable to find type [io.compression.zipfile]: make sure that the assembly conta ining this type is loaded.
At C:\Temp\tps1.ps1:7 char:25
+ [io.compression.zipfile] <<<< ::ExtractToDirectory($BackUpPath,     $destination) + CategoryInfo : InvalidOperation: (io.compression.zipfile:String
) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound
找不到Id。 在C:\Temp\tps1.ps1:5字符:9
+在未安装.NET 4.5的系统上添加类型,请使用:

$BackUpPath = "C:\Temp\Install.zip"
$Destination = "C:\Temp"

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($BackUpPath )
$destination = $shell_app.namespace($Destination )
$destination.Copyhere($zip_file.items(),0x4)
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::ExtractToDirectory($BackUpPath, $destination)
Expand-Archive $BackUpPath -destination $Destination
在使用.NET 4.5的系统上使用:

$BackUpPath = "C:\Temp\Install.zip"
$Destination = "C:\Temp"

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($BackUpPath )
$destination = $shell_app.namespace($Destination )
$destination.Copyhere($zip_file.items(),0x4)
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::ExtractToDirectory($BackUpPath, $destination)
Expand-Archive $BackUpPath -destination $Destination
上的脚本结合了上述两种方法

在PowerShell V5上,简化了很多:

$BackUpPath = "C:\Temp\Install.zip"
$Destination = "C:\Temp"

$shell_app=new-object -com shell.application
$zip_file = $shell_app.namespace($BackUpPath )
$destination = $shell_app.namespace($Destination )
$destination.Copyhere($zip_file.items(),0x4)
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::ExtractToDirectory($BackUpPath, $destination)
Expand-Archive $BackUpPath -destination $Destination
使用第三方库(如7-zip等)还有其他解压文件的方法,但这会产生依赖关系


注意:可以使用组策略设置Powershell执行策略。请参阅链接

错误似乎非常明显:缺少一个或多个必需的程序集…+添加类型好吧,Ken,作为powershell脚本的新手,“全部”如何?肯,仅仅因为它对你来说很简单,并不意味着它对每个人来说都很简单。你没有领会我的意思。只需阅读错误消息中的文字,就可以准确地告诉您问题所在,以及您需要做些什么来解决问题。我再问一次:*你不清楚哪一部分?你有指示要遵循。是什么阻止你跟随他们来解决这个问题?不,你没有领会我的意思。我是新来的,这是我的第一个脚本,如果它说要确保加载包含zipfile类型的程序集,那么我该怎么做?很好,对你理解这些东西很有好处。但是,要么帮帮忙,要么别麻烦。对不起。没有理由粗鲁。您可以尝试搜索与缺少程序集相关的问题,并查看结果,因为这正是错误消息所说的问题所在。不要对我大喊大叫,至少试着想想,特别是当有人明确指出错误信息中你没有读到的内容时。(说到这里,错误信息中的单词是有意义的,但是如果你不去读这些单词,跑到这里让别人牵着你的手帮你读的话,你永远也不会明白它的意思。)谢谢Kiran,我感谢你的帮助。是否有办法将两者都包含在同一个powershell脚本中,并让脚本检测要执行的命令?我知道我可以很简单地在bat中完成这项工作,但我无法通过批处理文件Hi Mark解压缩文件。是的,通过我链接的technet脚本
https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Function-to-727d6200
…它完全符合您的要求..只需将该函数复制到脚本中,并使用复制的函数…注意:函数中包含示例再次感谢Kiran:)