我对Powershell很新。我基本上只是使用我的C#logic和.net经验以及谷歌来创建这个脚本。我不明白为什么我得到错误:
无法在参数'machine'上处理参数转换。无法将值转换为System.String类型
function IterateThroughMachineSubkeys{
(
[Parameter()]
[string]$machine,
[Microsoft.Win32.RegistryKey]$subKey
)
foreach($subKeyName in $subKey.GetSubKeyNames())
{
Write-Host -Object ([System.String]::Format("Machine: {0} Module: {1} Version: {2}",
$machine.ToString(), $subKeyName.ToString(),
$subKey.OpenSubKey([string]$subKeyName).GetValue("Version", "Not found", [Microsoft.Win32.RegistryValueOptions]::None)))
}
}
这就是我调用函数的地方:
switch -CaseSensitive (ValidateConsoleInput((Read-Host).ToString()))
{
"E"
{
IterateThroughMachineSubkeys($machine.ToString(), $subKey)
}
"C"
{
Write-Host -Object "Enter the module name to be queried in the registry:"
GetSpecificSubkey($machine, $subkey, [string](Read-Host))
}
}
答案 0 :(得分:2)
您的代码存在一些问题。
1)未正确指定功能参数;它应该是:
function IterateThroughMachineSubkeys([string]$machine, [Microsoft.Win32.RegistryKey]$subKey)
{
...
}
2)函数调用不正确;它应该是:
IterateThroughMachineSubkeys -machine $machine.ToString() -subKey $subKey
这是完整的功能:
function IterateThroughMachineSubkeys([string]$machine, [Microsoft.Win32.RegistryKey]$subKey)
{
foreach($subKeyName in $subKey.GetSubKeyNames())
{
Write-Host -Object ([System.String]::Format("Machine: {0} Module: {1} Version: {2}",
$machine.ToString(), $subKeyName.ToString(),
$subKey.OpenSubKey([string]$subKeyName).GetValue("Version", "Not found", [Microsoft.Win32.RegistryValueOptions]::None)))
}
}
$testKey = get-item "HKCU:\Software"
IterateThroughMachineSubkeys -machine . -subKey $testKey
或使用PowerShell cmdlet:
$key = get-item "hkcu:\Software\Google\Chrome"
$key | get-childitem | foreach-object {
write-host "Machine: $machine Module: $($_.PSChildName) Version: " `
$key.OpenSubKey($_.PSChildName).GetValue("Version", "Not found", [Microsoft.Win32.RegistryValueOptions]::None)
}
答案 1 :(得分:0)
遇到了这个问题,只是想指出是什么为我解决了这个问题:
打印出变量(echo、Write-Host 什么的),并且非常注意它打印出来的内容。
就我而言,我没有为函数内的正则表达式搜索分配返回值,因此它会在我的函数内自动打印出“True”,并且尽可能将打印输出与您的实际返回值一起返回在 Powershell 中告诉,所以我的返回值是“True [实际返回值]”,这会引发此错误。