无法在参数'machine'上处理参数转换。无法将值转换为System.String类型

时间:2017-03-29 02:36:23

标签: .net powershell scripting

我对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))
   }

}

2 个答案:

答案 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 [实际返回值]”,这会引发此错误。