/build/static/layout/Breadcrumb_cap_w.png
11/14/2018 143 views

Hi all,

I'm using the following powershell script to try and export everything older than Windows 10 version 1803 so we can keep pc's up to date. It picks up everything that is Windows 10 and not on version 1803 yet. For some reason, it doesn't pick up a number of pc's that are Windows 7 or Windows 8 when the version number is below 10.0 (17134). I can't understand why this would be the case. Can anyone explain to me why, please? Strange thing is, if I change the '-lt' to '-gt', I get all the ones who have updated on the preview release installed which makes sense, but now the Windows 7 and Windows 8 are showing here with the greater than symbol. WHY? *facepalm*


Get-ADComputer -Filter {OperatingSystemVersion -lt "10.0 (17134)"} -Property * | Select-Object Name,OperatingSystem,OperatingSystemVersion | Sort-Object -Property Name | Export-Csv -path "C:\Version.csv" -NoTypeInformation

2 Comments   [ + ] Show comments

Comments

  • could be the windows 7-8 do not have the proper plugin or commandlets. Have you tried running this on a windows 7 and windows 8 machines via the powershell command prompt to see what errors it kicks?
  • PowerShell is doing the comparison as strings ("10.0 (17134)" isn't a number), so it only needs to check the first character to determine 1 is less than 7 or 8. I think you'd need to change the -lt to -ne, although then the list would include 1809.


Community Chosen Answer

2

Hi,

I believe it is most likely caused by the "Version" format you are trying to compare - "10.0 (17134)" is not a valid version.
If you try to convert it to [version] type, you would see following PS error:
Cannot convert value "10.0 (17134)" to type "System.Version". Error: "Input string was not in a correct format."

In this way you are performing a 'string' comparison which simply makes no sense. You can test it wit the following code:

$TMP = "10.0 (17134)"
$TMP2 = "6.1"
$RES = $TMP -lt $TMP2
Write-Host "`$TMP=$TMP`n`$TMP2=$TMP2`nOperation:`t$TMP < $TMP2`nResult:`t`t$RES"


Here are my results ;)

Operation:	10.0 (17134) < 6.1
Result: True

Operation: 10.0 (17134) < 7.0
Result: True

Operation: 10.0 (17134) < 80.0
Result: True

Operation: 10.0 (17134) < 123456
Result: True

Operation: 10.0 (17134) < 000.00 (00000)
Result: False

Operation: 10.0 (17134) < a
Result: True

Operation: 10.0 (17134) < dummy text bla bla
Result: True


I would suggest to export all the values from the environment and then think of a valid comparison method (split or regular expression may help to achieve the goal).
You can put here some of the values, maybe we could suggest something more.
Cheers.

Answered 11/14/2018 by: rad33k
Second Degree Brown Belt

All Answers

1

You can also use WMIC to get this all well MS provided built-in sysinfo and ver commands.


wmic os where "not version='10.0.17134'" get version

systeminfo | findstr /B /C:"OS Version"

ver


Answered 11/14/2018 by: SMal.tmcc
Red Belt