【问题标题】:Where is the source of my "cannot find path" error? (Remove-AppxProvisionedPackage)我的“找不到路径”错误的根源在哪里? (删除-AppxProvisionedPackage)
【发布时间】:2019-07-18 08:36:13
【问题描述】:

我正在处理的脚本出现错误,该脚本会取消配置一些 Win10 过时软件应用程序。

第 97 行字符 17 是下面找到的 Remove-AppxProvisionedPackage 的第一个字符。

相关变量:
$Logfile = "$Env:SystemRoot\Temp\RemoveApps_$($Buildnr).log"

WriteHostFile 是一个简单地将文本同时发送到终端和$Logfile 的函数。

这是在完全最新的 Windows 10 Pro 系统上,脚本是一个 powershell .ps1 脚本。

我调查了$Logfile,它不仅被创建,而且Removing Provisioned Package: $ProPackageFullName 正在按预期附加。可以修改日志文件,WriteHostFile 功能起作用。 (我也知道这是一个糟糕的 var 名称。稍后我会使其更明智。)

老实说,我不确定我还能尝试什么,否则我不会在这里问。

            # Removes app from provisioning
            if ($ProPackageFullName) {
                WriteHostFile "Removing Provisioned Package: $ProPackageFullName"
                start-sleep -Seconds 5 
                Remove-AppxProvisionedPackage -online -packagename $ProPackageFullName | Out-File -FilePath $Logfile -Append -Encoding ascii  

错误:

Remove-AppxProvisionedPackage : The system cannot find the path specified.
At [redacted directory]\RemoveApps.ps1:97 char:17
+ ...             Remove-AppxProvisionedPackage -online -packagename $ProPa ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Remove-AppxProvisionedPackage], COMException
    + FullyQualifiedErrorId : Microsoft.Dism.Commands.RemoveAppxProvisionedPackageCommand

该错误仅发生在实际卸载的软件包上。此代码段包含在一个 foreach 循环中,该循环首先检查包是否已安装。

我现在注意到我正在测试的两台机器之间存在差异。 第一个,运行 PowerShell 5.1 build 18362 修订版 145,脚本正常工作 - 按预期删除应用程序。 第2次,运行PowerShell 5.1 build 17134 revision 228,脚本出现上述问题。

【问题讨论】:

  • Get-AppXProvisionedPackage -Online 是否列出了您要删除的软件包?如果是这样,如果您从该命令中获取目标包并将其通过管道传输到 Remove-AppxProvisionedPackage -online 会发生什么?
  • 为我工作。必须是管理员。包名对吗? Remove-AppxProvisionedPackage -Online -PackageName Microsoft.ZuneMusic_2019.19011.11311.0_neutral_~_8wekyb3d8bbwe
  • 是的,正在删除的应用程序已安装。但是我刚刚发现没有出现错误的应用程序都没有安装,而出现错误的应用程序都是。在此之前我有更多代码可以在尝试卸载之前检测包是否已安装。软件包名称是正确的,并且在卸载之前会对其进行修剪,以防万一之前和之后的奇怪内容(例如 19011.11311.0_neutral_~_8wekyb3d8bbwe)发生变化。我有一个早期版本的脚本,但现在我不确定出了什么问题。我不记得修改过这段代码。
  • 我呃,我才意识到我之前确实编辑过这个部分。 $PackageFullName = (Get-AppxPackage $App -AllUsers).PackageFullName 是我声明该变量的原因。我添加了-AllUsers,因为它并没有为所有用户卸载应用程序,事后看来,我是个白痴,我认为这可以在一个用作字符串而不是数组的变量中工作。
  • 而且.. 由于某种原因,即使在修复该问题后,问题仍然存在。仍然没有卸载,仍然是同样的错误,在同一行和字符上。

标签: powershell windows-10


【解决方案1】:

没有那么复杂。

# "remove-appxpackage -allusers" only works starting in windows 10 version 1809, 
#   otherwise works on current user
# "remove-appxpackage -user" does not work
# remove installed apps starting with "a"
get-appxpackage -allusers a* | remove-appxpackage -whatif -allusers 

# this would ONLY delete the a* apps for the current user
get-appxpackage -allusers a* | remove-appxpackage -whatif

# remove-appxprovisionedpackage has no -whatif option
# remove "to be installed apps for new users" starting with "a"
Get-AppxProvisionedPackage -Online | where displayname -like a* | 
  Remove-AppxProvisionedPackage -Online

【讨论】:

  • 我不认为它必须那么复杂,但我尽可能避免接触原始的 removeapps 代码,因为担心这个确切的问题(不是卸载应用程序),哈哈。 a* 部分是干什么用的?我试过Get-AppxPackage a* 看看它会输出什么,但我什么也没得到。尝试了整条线并得到了相同的结果。我应该用我的 $App 变量替换它,还是它在 PowerShell 中是特殊的?
  • 您使用的脚本无论如何都会调用它。这应该列出所有以字母 a 开头的应用程序,如果它们是作为当前用户安装的。也许您需要get-appxpackage -allusers a*,但这并不影响哪些用户将其删除。
  • 哦,我明白现在 a* 是什么了。完全错过了您的两条评论行。我不得不进行一些调整,因为Remove-AppxProvisionedPackage 似乎不接受管道,它仍然无法正常工作。参数-PackageName 以某种方式变为空。我在该命令之前和之后都有Write-Host $App,Write-Host 正在获取应用程序的正确完整包名称。 Here's the newest version with irrelevant functions removed。更糟糕的是,即使在我的笔记本电脑上使用更新版本的 PS,它也会出现同样的错误。
  • Remove-appxprovisionedpackage 通过管道接受包名,但只能通过属性名,例如来自 get-appxprovisionedpackage。
  • 我明白了。我看不出我测试的东西有什么不同,但是复制粘贴它就可以了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2023-03-17
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多