0

使用 Powershell 5.1,我正在尝试在以下位置创建注册表值:(
HKLM:\SOFTWARE\Classes\.
注意尾随句点)

不幸的是Set-ItemProperty似乎忽略了尾随 . 并在: 下创建值
HKLM:\SOFTWARE\Classes

我以管理员身份运行 Powershell ISE,并测试了各种引号、路径和 LiteralPath、反引号转义和尾随 / 无济于事。

我已经在不同的键下尝试了以下内容,以防类有什么奇怪的......

$PSVersionTable.PSVersion

New-Item -Path 'HKLM:\SOFTWARE\aTest\.' -ItemType RegistryKey -Force -ErrorAction SilentlyContinue > $null
New-Item -Path 'HKLM:\SOFTWARE\aTest\`.' -ItemType RegistryKey -Force -ErrorAction SilentlyContinue > $null

Set-ItemProperty -LiteralPath HKLM:\SOFTWARE\aTest\.   -Name 'Test01' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath 'HKLM:\SOFTWARE\aTest\.' -Name 'Test02' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath "HKLM:\SOFTWARE\aTest\." -Name 'Test03' -Value 'emptyFile' -Verbose;

Set-ItemProperty -Path HKLM:\SOFTWARE\aTest\.   -Name 'Test04' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path 'HKLM:\SOFTWARE\aTest\.' -Name 'Test05' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path "HKLM:\SOFTWARE\aTest\." -Name 'Test06' -Value 'emptyFile' -Verbose;

Set-ItemProperty -LiteralPath HKLM:\SOFTWARE\aTest\`.   -Name 'Test07' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath 'HKLM:\SOFTWARE\aTest\`.' -Name 'Test08' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath "HKLM:\SOFTWARE\aTest\`." -Name 'Test09' -Value 'emptyFile' -Verbose;

Set-ItemProperty -Path HKLM:\SOFTWARE\aTest\`.   -Name 'Test10' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path 'HKLM:\SOFTWARE\aTest\`.' -Name 'Test11' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path "HKLM:\SOFTWARE\aTest\`." -Name 'Test12' -Value 'emptyFile' -Verbose;

Set-ItemProperty -LiteralPath HKLM:\SOFTWARE\aTest\.\   -Name 'Test13' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath 'HKLM:\SOFTWARE\aTest\.\' -Name 'Test14' -Value 'emptyFile' -Verbose;
Set-ItemProperty -LiteralPath "HKLM:\SOFTWARE\aTest\.\" -Name 'Test15' -Value 'emptyFile' -Verbose;

Set-ItemProperty -Path HKLM:\SOFTWARE\aTest\.\   -Name 'Test16' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path 'HKLM:\SOFTWARE\aTest\.\' -Name 'Test17' -Value 'emptyFile' -Verbose;
Set-ItemProperty -Path "HKLM:\SOFTWARE\aTest\.\" -Name 'Test18' -Value 'emptyFile' -Verbose;

但输出显示它忽略了 . 除非从字面上逃脱(当它创建一个带有反引号的键时......

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  228
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test01".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test02".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test03".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test04".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test05".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test06".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test07".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\`. Property: Test08".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test09".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test10".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\`. Property: Test11".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest Property: Test12".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test13".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test14".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test15".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test16".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test17".
VERBOSE: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\aTest\ Property: Test18".

请问我错过了什么?

4

1 回答 1

0

考虑以下示例:

PS D:\PShell> New-Item -Path 'HKLM:\SOFTWARE\Test\.' -ItemType RegistryKey -WhatIf
What if: Performing the operation "New Item" 
         on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE\Test".

PS D:\PShell> New-Item -Path 'HKLM:\SOFTWARE\Test\..' -ItemType RegistryKey -WhatIf
What if: Performing the operation "New Item" 
         on target "Item: HKEY_LOCAL_MACHINE\SOFTWARE".

PS D:\PShell> (Resolve-Path -LiteralPath 'HKLM:\Software\Test\.').Path
HKLM:\Software\Test

PS D:\PShell> (Resolve-Path -LiteralPath 'HKLM:\Software\Test\..').Path
HKLM:\Software

显然,Powershell 的Registry提供者将一个单独的句点(以及双倍句点)用作关键路径组件,类似于命名约定中描述的合适FileSystem目录组件

  • 使用句点作为路径中的目录组件来表示当前目录,例如".\temp.txt". 有关详细信息,请参阅路径
  • 在路径中使用两个连续的句点 ( ..) 作为目录组件来表示当前目录的父目录,例如 "..\temp.txt". 有关详细信息,请参阅路径

但是,reg.exe允许创建、读取、设置或删除注册表项和值,包括...键,请参见以下示例:

==> reg query "HKCU\Software\Test\."

HKEY_CURRENT_USER\Software\Test\.
    value_inside_PeriodKey    REG_SZ


==> reg add "HKCU\Software\Test\.."
The operation completed successfully.

==> reg query "HKCU\Software\Test"

HKEY_CURRENT_USER\Software\Test
    SomeTestString    REG_SZ    Test String

HKEY_CURRENT_USER\Software\Test\.
HKEY_CURRENT_USER\Software\Test\..

出于明显的原因(安全性), 请注意在后面的示例中使用HKCU而不是。HKLM

于 2018-11-10T16:53:09.157 回答