我编写了一个 Powershell 脚本来删除 Windows 10 上的 Windows 应用商店和 Cortana。我编写并成功测试了该脚本。现在我将脚本添加到 GPO 上的 LogonScripts 并测试该脚本是否正在运行,也成功了。但它没有做它应该做的事情。
首先,这是脚本:
$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
if ($WSV -eq "Microsoft.WindowsStore")
{Get-AppxPackage -allusers "*WindowsStore*" | Remove-AppxPackage}
$Cor =(Get-AppxPackage -Name Microsoft.549981C3F5F10).name
if ($Cor -eq "Microsoft.549981C3F5F10")
{Get-AppxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage}
它只是检查 AppX 包是否存在,如果存在,就会将其删除。如果手动启动脚本,则此方法有效。但它不能作为登录脚本运行。我的第一个想法是,脚本根本没有运行。所以我添加了在 C 根目录中创建一个文件夹,我可以通过创建此文件夹来确认脚本正在运行。
那么为什么它没有按预期工作呢?有没有办法以某种方式获取脚本的错误消息?
执行策略不受限制。它在 GPO 的计算机配置上运行,因此它应该具有计算机权限。
答案1
作为启动脚本而不是登录脚本运行,因为该命令使用参数来-AllUsers
确保权限足以在运行时删除所有用户的包。
Set-ExecutionPolicy Unrestricted
尽管您说已经将执行策略设置为这样,但我还是会将其放入脚本中,以防万一。
最后,据我所知,删除软件包需要完整的软件包名称,因此请使用下面的 PowerShell 获取要删除的应用程序的完整软件包名称。
使用以下命令中指定的 PowerShell 逻辑而不是您当前使用的逻辑来帮助解决问题。
电源外壳
Set-ExecutionPolicy Unrestricted;
Get-AppxProvisionedPackage –Online | % {
If($_.DisplayName -eq "Microsoft.WindowsStore")
{Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
};
Get-AppxProvisionedPackage –Online | % {
If($_.DisplayName -eq "Microsoft.549981C3F5F10")
{Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
};
"Microsoft.WindowsStore" | %{
$p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
If($p){Remove-AppxPackage -Package $p -AllUsers};
};
"Microsoft.549981C3F5F10" | %{
$p = (Get-AppxPackage -Name $_ | %{$_.PackageFullName});
If($p){Remove-AppxPackage -Package $p -AllUsers};
};
支持资源
答案2
您的 PowerShell 代码错误。
$WSV =(Get-AppxPackage -Name "*WindowsStore*").name
# can also be written as
$WSV = Get-AppxPackage -Name "*WindowsStore*" | Select-Object -ExpandProperty Name
此查询有时会返回一个数组,具体取决于返回的元素数量:
PS > Get-Item *.html, *.log
Directory: /Users/megamorf
Mode LastWriteTime Length Name
---- ------------- ------ ----
----- 06.04.2020 18:04 730 back-to-work.html
----- 05.10.2020 12:32 4269 jmeter.log
----- 28.09.2020 14:41 246873 olv.log
----- 20.10.2020 16:28 170945 web.log
PS > $Result = (Get-Item "*.log").Name
PS > $Result.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS > $Result = (Get-Item "*.html").Name
PS > $Result.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
-eq
处理数组时,比较运算符不正确。在这种情况下,您需要使用-in
( $obj -in $array
) 或-contains
( $array -contains $obj
)。
整个代码可以简化为:
$AppsToDelete = @("Microsoft.WindowsStore", "Microsoft.549981C3F5F10")
foreach ($UnwantedApp in $AppsToDelete) {
Get-AppxPackage -Name $UnwantedApp -AllUsers | Remove-AppxPackage
}