【发布时间】:2021-07-24 08:20:46
【问题描述】:
我在 XML 文件中有数据,最终将用作注册表路径,其中可能包含非打印字符(例如,将路径从网站复制到 XML 时)。如果发现非打印字符,我想验证数据并抛出特定错误。
在 Powershell 中,如果我在单引号中定义了一个带有非打印字符的变量,然后 test-Path 它测试为有效路径,因为非打印字符被作为文字处理。
Test-Path 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\`n@microsoft.com/GENUINE\@microsoft.com/GENUINE' -isValid
同样的东西用双引号将“扩展”非打印字符并返回false,这是我需要的。
Test-Path "HKEY_LOCAL_MACHINE\SOFTWARE\Test\`n@microsoft.com/GENUINE\@microsoft.com/GENUINE" -isValid
我找到了对 [string]::Format(() 的引用,用于扩展非打印字符,但是
$invalidPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\`n@microsoft.com/GENUINE\@microsoft.com/GENUINE'
[string]::Format("{0}",$invalidPath)
未按预期扩展非打印字符。
我也看到过使用 Invoke-Expression 的参考,但这并不安全,也不是一种选择。
终于找到了$ExecutionContext.InvokeCommand.ExpandString(),好像可行,
$ExecutionContext.InvokeCommand.ExpandString('HKEY_LOCAL_MACHINE\SOFTWARE\Test\`n@microsoft.com/GENUINE\@microsoft.com/GENUINE')
返回一个多行字符串到控制台,而
$ExecutionContext.InvokeCommand.ExpandString('Write-Host "Screwed"') 将实际字符串返回到控制台,而不是实际执行 Write-Host 并且仅将 Screwed 返回到控制台。
最后,
$invalidPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\`n@microsoft.com/GENUINE\@microsoft.com/GENUINE'
Test-Path ($ExecutionContext.InvokeCommand.ExpandString($invalidPath)) -isValid
按预期返回 false。这让我认为这是追求的正确方法,但考虑到其他地方的所有问题,我想 100% 确定这种方法不会被用作安全弱点。我是在正确的轨道上,还是我的 Google-Fu 还没有出现的陷阱?
【问题讨论】: