gerhardub
asked on
Powershell issue with formating information returned from a function
Ok,
I've got the following function that reads all of the installed programs from a Windows computer's registry.
...and it works great for telling me the exactly version and name of software installed on a Windows 32bit/64bit system.
However, if I call the funtion using this format:
$x = Get-InstalledPrograms <computer name>
The result is that I get a variable with the infromation returned from the function.
So, I can then issue the command:
$x.keys and see a list of everything installed. ...but is a runon sentance type list... not an array.
What I can't do is execute:
$x.keys[1] and get the first item in the list... and it doesn't seem to be translating into an array variable, as I'm getting this:
Unable to index into an object of type System.Collections.Hashtab le+KeyColl ection.
At line:1 char:32
+ $InstalledApplicationList. keys[ <<<< 1]
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
So, clearly, I need to figure out how to get $x.keys and $x.values (which have a 1 to 1 relationship) to be in an array. This way I can check what's on a specific PC against a list of application that I'm looking for, from another source.
Thoughts?
The function is below:
I've got the following function that reads all of the installed programs from a Windows computer's registry.
...and it works great for telling me the exactly version and name of software installed on a Windows 32bit/64bit system.
However, if I call the funtion using this format:
$x = Get-InstalledPrograms <computer name>
The result is that I get a variable with the infromation returned from the function.
So, I can then issue the command:
$x.keys and see a list of everything installed. ...but is a runon sentance type list... not an array.
What I can't do is execute:
$x.keys[1] and get the first item in the list... and it doesn't seem to be translating into an array variable, as I'm getting this:
Unable to index into an object of type System.Collections.Hashtab
At line:1 char:32
+ $InstalledApplicationList.
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
So, clearly, I need to figure out how to get $x.keys and $x.values (which have a 1 to 1 relationship) to be in an array. This way I can check what's on a specific PC against a list of application that I'm looking for, from another source.
Thoughts?
The function is below:
function Get-InstalledPrograms($computer = '.') {
$programs_installed = @{};
$error_action = 'Stop';
$reg_uninstall_paths = @('Software\Microsoft\Windows'`
+ '\CurrentVersion\Uninstall');
$reg_uninstall_paths += @('Software\Wow6432Node\Microsoft'`
+ '\Windows\CurrentVersion\Uninstall');
$hkey = 'LocalMachine';
$registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($hkey, $computer);
foreach ($reg_uninstall_path in $reg_uninstall_paths) {
$reg_uninstall_key = $registry.OpenSubKey($reg_uninstall_path);
if ($reg_uninstall_key -eq $null) {
continue;
}
$key_names = $reg_uninstall_key.GetSubKeyNames();
foreach ($key_name in $key_names) {
$key_properties = $reg_uninstall_key.OpenSubKey($key_name);
$name = $key_properties.GetValue('DisplayName');
$version = $key_properties.GetValue('DisplayVersion');
if ($name -ne $null) {
$programs_installed.$name = $version;
}
$key_properties.close();
}
$reg_uninstall_key.close();
}
$registry.close();
$reg_uninstall_paths = @('Software\Microsoft\Installer\Products');
$hkey = 'CurrentUser';
$registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($hkey, $computer);
foreach ($reg_uninstall_path in $reg_uninstall_paths) {
$reg_uninstall_key = $registry.OpenSubKey($reg_uninstall_path);
if ($reg_uninstall_key -eq $null) {
continue;
}
$key_names = $reg_uninstall_key.GetSubKeyNames();
foreach ($key_name in $key_names) {
$key_properties = $reg_uninstall_key.OpenSubKey($key_name);
$name = $key_properties.GetValue('ProductName');
$version = $key_properties.GetValue('DisplayVersion');
if ($name -ne $null) {
$programs_installed.$name = $version;
}
$key_properties.close();
}
$reg_uninstall_key.close();
}
$registry.close();
return $programs_installed;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
What does not always work?
ASKER
Oh...oh... sorry about that... I reading one message and replied to another.
That seems like it would work... and be an easy solution. Let me give that a try... on just the app name.
Where it fail for us, is that we ALSO need to be checking the version number, and it's concievable that the version number will not always be unique.
...and other ideas on how to get this to work?
That seems like it would work... and be an easy solution. Let me give that a try... on just the app name.
Where it fail for us, is that we ALSO need to be checking the version number, and it's concievable that the version number will not always be unique.
...and other ideas on how to get this to work?
ASKER
Just to clarify (since I assumed a detailed look at the function):
So, when I do $x.values (which corresponds to the version for each of those apps listed in $x.keys), I get a long line of version numbers...
The ideal solution would to be to parse each line into either a multi-dimentional array $x[a,b] or a new array with the format $app.name and $app.version.... that supports standard $array[1].name formating.
So, when I do $x.values (which corresponds to the version for each of those apps listed in $x.keys), I get a long line of version numbers...
The ideal solution would to be to parse each line into either a multi-dimentional array $x[a,b] or a new array with the format $app.name and $app.version.... that supports standard $array[1].name formating.
That is what my code above does.
$appsarray[0].name gives the name of the first app and
$appsarray[0].version gives the version.
$appsarray[0].name gives the name of the first app and
$appsarray[0].version gives the version.
ASKER
Sorry man... totally distracted... Lemme plug it in tomorrow and then give you your 500 points when it works?
ASKER
Thank you sir, that appears to have given me enought to go on with!
Sincerely,
GB
Sincerely,
GB
ASKER