【问题标题】:Formatting results of get-item differently以不同方式格式化获取项目的结果
【发布时间】:2019-02-07 15:26:46
【问题描述】:

我有一个注册表项,我需要从中检索字符串的名称。
例如:HKLM:\Software\MyRegKey 中有四个字符串值。字符串 A、字符串 B、字符串 C 和字符串 D。我使用以下 Powershell 来收集这些信息

Get-Item -Path HKLM:\Software\MyRegKey | select-object -expandproperty`
property

以上将返回以下内容:

A
B
C
D

我需要做的是以不同的方式格式化输出。简单地说,我需要它只返回一个值,然后我需要将它放入 foreach 语句中以迭代并返回其余值。

这可能吗?

Get-Item -Path HKLM:\Software\MyRegKey | select-object -expandproperty`
property

Get-Item -Path HKLM:\Software\MyRegKey | select-object -expandproperty`
property

以上将返回以下内容:

A
B
C
D

期望的输出:

A

然后运行一个 foreach 语句来单独收集每个值。

【问题讨论】:

  • 由于格式错误,不清楚 Get-Item -Path HKLM:\Software\MyRegKey 是否返回一个数组,您可以简单地通过管道传递给 ForEach-Object

标签: powershell


【解决方案1】:

如果您在这样的字符串中有多个值:

$MyRegKey = "A B C D"
$MyRegKey.Count
1

如果你想逐步浏览它们,你可以像这样在“空格”字符上拆分。

$MyRegKey = $MyRegKey.Split()
$MyRegKey.Count
4

这为您提供了可以使用 For-EachObject cmdlet 进行迭代的内容。

$MyRegKey
A
B
C
D

更新

想象一下像这样创建一个新的 regkey:

New-Item HKCU:\Software\MyRegKey 
New-ItemProperty -Path HKCU:\Software\MyRegKey -Name MyRegValue -PropertyType String -Value "A B C D"

这将创建以下密钥:

我可以使用以下代码检索它的值:

$MyRegKey = Get-ItemProperty -Path HKCU:\Software\MyRegKey -Name MyRegValue
$MyRegKey.MyRegValue.Split()
A
B
C
D

我们可以像这样遍历这些值:

MyRegKey.MyRegValue.Split() | ForEach-Object { "Property $i of MyRegKey = $_" ;$i++}
Property 0 of MyRegKey = A
Property 1 of MyRegKey = B
Property 2 of MyRegKey = C
Property 3 of MyRegKey = D

最终更新

我们可以使用这段代码快速创建以下 regkey:

'A','B','C','D' | % {
New-ItemProperty -Path HKCU:\Software\MyRegKey -Name $_ -PropertyType String -Value "A B C D"
}

给我们这些价值观:

要在ForEach-Object 循环中处理这些问题,我们可以使用以下代码:

(Get-Item -Path HKCU:\Software\MyRegKey).Property | ForEach-Object { 
    Write-Host "The key $_ has a value of $((Get-ItemProperty HKCU:\Software\MyRegKey -Name $_).$_)"
}

这给出了以下输出:

The key A has a value of A B C D
The key B has a value of A B C D
The key C has a value of A B C D
The key D has a value of A B C D

【讨论】:

  • 好的,所以我想出了这个代码:$myregkey = get-item -path HKLM:\Software\MyRegkey | select-object - expandproperty property $MyRegKey = $MyRegkey.split() 但是,我认为这是不对的。为一行代码道歉,cmets 不会让我按 Enter 换行。当我在此处输入时,它会保存编辑。
  • 你能给出一个确切的例子来说明键的值是什么样的,然后你想如何访问数据?我认为您可能需要改写您的问题,现在很难理解:(
  • 我当然可以试试。因此,在您的示例中,您正在检索字符串的值。我不想那样做。我只想检索注册表项 MyRegKey 中的字符串。 !Valid XHTML 您可以在屏幕截图中看到字符串是我使用get-item -Path HKLM:\Software\MyRegKey | select-object -expandproperty property 返回的内容,该代码可以返回正确的数据,但就像我提到的那样,它作为一个数据块返回。我需要它单独返回,然后将它传递到 foreach 语句中。
  • 一张截图值一千字!我现在明白了 :) 查看我的最终更新
  • 看起来这不是我想要的。您是否看到在最终更新中返回 A、B、C 和 D 的值?我不想那样做。我只想将 A、B、C 和 D 作为单独的对象返回。如果您查看以下 VB 脚本 pastebin.com/bB9g9yuB 并运行它,您将看到它如何将键中的名称分别返回为 A、B、C 和 D。 PowerShell 将它作为 A、B、C 和 D 的一大块返回。这有意义吗?
【解决方案2】:

以下是我最终得到的结果,并且似乎正在工作,因为变量 $i 仅包含一个值。 $t = get-item -Path HKLM:\Software\MyRegKey | select-object -expandproperty property foreach($i in $t){$i} 这通过改变我执行 foreach 循环的方式来实现。我错误地将变量传递到 foreach 循环中。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 2023-01-26
    • 1970-01-01
    • 2015-01-19
    • 2022-01-05
    • 2022-11-01
    • 2017-01-26
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多