首页 > 解决方案 > 无法将变量插入到 Get-Item 的路径中

问题描述

我正在尝试获取由返回分隔的字符串列表并按=符号拆分它们,双方都匹配由 Get-Item 查询的注册表项。前半部分总是匹配得很好,但引用后半部分只匹配列表中的最后一项:

前半部分示例:

[string[]]$Patch = (".accda=Access.ACCDAExtension.16
.accdb=Access.Application.16" -split "`n")

Foreach ($a in $Patch) {
    $RegKey = ($a -split "=")[0]
    $Result = Get-Item -Path "Registry::HKEY_CLASSES_ROOT\$RegKey"
    echo $Result
}

这将返回:

Name                           Property                                                                                                                                                                                    
----                           --------                                                                                                                                                                                    
.accda                         (default)    : Access.ACCDAExtension.16                                                                                                                                                     
                               Content Type : application/msaccess.addin                                                                                                                                                   
.accdb                         (default)    : Access.Application.16                                                                                                                                                        
                               Content Type : application/msaccess    

下半场示例:

[string[]]$Patch = ("
.accda=Access.ACCDAExtension.16
.accdb=Access.Application.16
" -split "`n")

Foreach ($a in $Patch) {
    $RegKey = ($a -split "=")[1]
    $Result = Get-Item -Path "Registry::HKEY_CLASSES_ROOT\$RegKey"
}

这将返回:

Get-Item : Cannot find path 'HKEY_CLASSES_ROOT\Access.ACCDAExtension.16' because it does not exist.
At line:6 char:15
+     $Result = Get-Item -Path "Registry::HKEY_CLASSES_ROOT\$RegKey"
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (HKEY_CLASSES_RO...DAExtension.16:String) [Get-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand



    Hive: HKEY_CLASSES_ROOT


Name                           Property                                                                                                                                                                                    
----                           --------                                                                                                                                                                                    
Access.Application.16          (default) : Microsoft Access Database        

但是,该注册表项确实存在,如果我手动运行该命令,它会找到它:

get-item Registry::HKEY_CLASSES_ROOT\Access.ACCDAExtension.16


    Hive: HKEY_CLASSES_ROOT


Name                           Property                                                                                                                                                                                    
----                           --------                                                                                                                                                                                    
Access.ACCDAExtension.16       (default) : Microsoft Access Add-in

我很确定这是由每行末尾的返回引起的。


PowerShell 5.1 版

标签: powershell

解决方案


我已经解决了这个问题,我让我的列表成为字符串列表:

[string[]]$Patch = (".accda=Access.ACCDAExtension.16",
".accdb=Access.Application.16" -split "`n")

Foreach ($a in $Patch) {
    $RegKey = ($a -split "=")[1]
    $Result = Get-Item -Path "Registry::HKEY_CLASSES_ROOT\$RegKey"
}

该问题可能是由于每行末尾的返回引起的,也许我也可以将其从命令中过滤掉。


推荐阅读