测试路径注册表项在 Windows 终端中有效,但在我的 .ps1 脚本中无效
Test-Path Registry key works in Windows Terminal but not in my .ps1 script
我想通过使用测试路径来测试注册表项是否存在:
if((Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings') -eq $true) {
echo "Registry Key Exists, Ignoring this machine."
exit
}
else {
...
我在注册表中手动创建了这个键,它看起来像这样:
但是,运行此脚本永远不会退出,而是会进入 else 语句。
为了测试这一点,我在 Windows 终端中尝试了 Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings'
,它以适当的 True 响应。
我很困惑为什么这些不同,如果有人能够帮助解决这个问题,我会很高兴。
非常感谢
编辑:
奇怪的是,如果我 运行 来自 Windows 终端的 powershell 脚本,它会很好地检测到注册表项,但如果我尝试 运行 从 PowerShell ISE 它不起作用。这确实解决了我的问题,因为当我调用它时脚本可以正常工作,所以我将关闭这个问题。
谢谢大家的帮助:)
您使用 Test-Path cmdlet 查看密钥是否存在。 Test-Path 可以检测注册表项(容器),但无法检测注册表条目(有时称为“值”)或条目中的数据。如果您尝试,它总是 returns FALSE。
您使用 Get-ItemProperty cmdlet 查看键值
$path = "HKLM:\SOFTWARE\Intel\Display\igfxcuiD"
$value = "Global"
#You can use the Test-Path cmdlet to check for the key, but not for specific values within a key
Test-Path $path
#You can use the Get-ItemProperty to see the value
Get-ItemProperty -Path $Path | Select-Object -ExpandProperty $Value
奇怪的是,如果我 运行 来自 Windows 终端的 powershell 脚本,它会很好地检测到注册表项,但如果我尝试 运行 从 PowerShell ISE 它不起作用。这确实解决了我的问题,因为当我调用它时脚本可以正常工作,所以我将关闭这个问题。谢谢大家的帮助:)
如您所确认,问题是您运行您的脚本来自 ISE32 位版本,在 HKEY_LOCAL_MACHINE\SOFTWARE
子树 中看到 不同的 ,32-bit-application-specific 注册表信息(表示为 PowerShell路径,相当于HKLM:\SOFTWARE
).
如果不小心使用了 32 位 ISE(检查 window 标题是否以 (x86)
结尾),只需 运行 64 位版本 (例如,来自 64 位 PowerShell 的 运行 powershell_ise
或启动 C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe
的 cmd.exe
session)
否则,见下文。
如果您真的必须从 32 位进程[=46]测试 64 位 HKEY_LOCAL_MACHINE\SOFTWARE
子树中是否存在密钥 =],需要更多的工作;一种选择是使用 reg.exe
:
if ($(reg.exe query 'HKEY_LOCAL_MACHINE\SOFTWARE\IDTSettings' /reg:64 *>$null; -not $LASTEXITCODE)) {
"Registry key exists, ignoring this machine."
exit
}
else {
# ...
}
请注意 inverse 解决方案 - 从 64 位进程访问 32 位密钥会更简单:32 位数据可通过 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
子树
(if (Test-Path 'HKLM:\SOFTWARE\Wow6432Node\IDTSettings') { ... }
)
我想通过使用测试路径来测试注册表项是否存在:
if((Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings') -eq $true) {
echo "Registry Key Exists, Ignoring this machine."
exit
}
else {
...
我在注册表中手动创建了这个键,它看起来像这样:
但是,运行此脚本永远不会退出,而是会进入 else 语句。
为了测试这一点,我在 Windows 终端中尝试了 Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings'
,它以适当的 True 响应。
我很困惑为什么这些不同,如果有人能够帮助解决这个问题,我会很高兴。
非常感谢
编辑:
奇怪的是,如果我 运行 来自 Windows 终端的 powershell 脚本,它会很好地检测到注册表项,但如果我尝试 运行 从 PowerShell ISE 它不起作用。这确实解决了我的问题,因为当我调用它时脚本可以正常工作,所以我将关闭这个问题。 谢谢大家的帮助:)
您使用 Test-Path cmdlet 查看密钥是否存在。 Test-Path 可以检测注册表项(容器),但无法检测注册表条目(有时称为“值”)或条目中的数据。如果您尝试,它总是 returns FALSE。
您使用 Get-ItemProperty cmdlet 查看键值
$path = "HKLM:\SOFTWARE\Intel\Display\igfxcuiD"
$value = "Global"
#You can use the Test-Path cmdlet to check for the key, but not for specific values within a key
Test-Path $path
#You can use the Get-ItemProperty to see the value
Get-ItemProperty -Path $Path | Select-Object -ExpandProperty $Value
奇怪的是,如果我 运行 来自 Windows 终端的 powershell 脚本,它会很好地检测到注册表项,但如果我尝试 运行 从 PowerShell ISE 它不起作用。这确实解决了我的问题,因为当我调用它时脚本可以正常工作,所以我将关闭这个问题。谢谢大家的帮助:)
如您所确认,问题是您运行您的脚本来自 ISE32 位版本,在 HKEY_LOCAL_MACHINE\SOFTWARE
子树 中看到 不同的 ,32-bit-application-specific 注册表信息(表示为 PowerShell路径,相当于HKLM:\SOFTWARE
).
如果不小心使用了 32 位 ISE(检查 window 标题是否以
(x86)
结尾),只需 运行 64 位版本 (例如,来自 64 位 PowerShell 的 运行powershell_ise
或启动C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe
的cmd.exe
session)否则,见下文。
如果您真的必须从 32 位进程[=46]测试 64 位 HKEY_LOCAL_MACHINE\SOFTWARE
子树中是否存在密钥 =],需要更多的工作;一种选择是使用 reg.exe
:
if ($(reg.exe query 'HKEY_LOCAL_MACHINE\SOFTWARE\IDTSettings' /reg:64 *>$null; -not $LASTEXITCODE)) {
"Registry key exists, ignoring this machine."
exit
}
else {
# ...
}
请注意 inverse 解决方案 - 从 64 位进程访问 32 位密钥会更简单:32 位数据可通过 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
子树
(if (Test-Path 'HKLM:\SOFTWARE\Wow6432Node\IDTSettings') { ... }
)