我製作了一個 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-Package 是否存在,如果存在,則會將其刪除。如果腳本是手動啟動的,則此方法有效。但它不能像登入腳本一樣工作。我的第一個想法是,腳本根本沒有運行。因此,我在 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
}