Powershell PrintManagement cmdlet을 사용하여 프린터 드라이버 버전을 검색하시겠습니까?

Powershell PrintManagement cmdlet을 사용하여 프린터 드라이버 버전을 검색하시겠습니까?

GUI의 버전 번호는 10.0.17134.1 및 3.0.8.0처럼 보이지만 Get-PrinterDriver-cmdlet의 해당 버전(?)은 적어도 비밀스러워 보입니다.

Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion

나에게 다음과 같은 출력을 제공합니다.

Name                   MajorVersion    DriverVersion
----                   ------------    -------------
Microsoft XPS Docu...             4 2814750890000385
Samsung Universal ...             3  844424930656256

따라서 WMI/CIM cmdlet을 사용하여 WMI/CIM cmdlet을 사용해야 합니까?진짜버전 번호?

답변1

Get-PrinterDriver이는 '이(가) DriverVersion유형이기 때문입니다.UInt64:

여기에 이미지 설명을 입력하세요

이 문제를 해결하는 획기적인 방법은 아래(원천). 이러한 값을 우리가 기대하는 형식으로 재구성하는 보다 우아한 방법이 있기를 바랍니다. 하지만 이 방법이 현재 상황을 가장 잘 이해하는 데 얼마나 투명한지 감사합니다.

Get-PrinterDriver | Select-Object Name,@{
    n="DriverVersion";e={

        $ver = $_.DriverVersion
        $rev = $ver -band 0xffff
        $build = ($ver -shr 16) -band 0xffff
        $minor = ($ver -shr 32) -band 0xffff
        $major = ($ver -shr 48) -band 0xffff
        "$major.$minor.$build.$rev"

    }
}

내 컴퓨터에서 실행했을 때의 첫 번째 결과는 다음과 같습니다.

Name                                                    DriverVersion 
----                                                    ------------- 
Send to Microsoft OneNote 16 Driver                     16.0.7629.4000

변환은 다음을 사용하여 작동합니다.비트 연산16비트 섹션에서 각각(64비트)을 평가하여 DriverVersion메이저, 마이너, 빌드 및 개정 번호를 결정합니다.

예를 들어 내 컴퓨터의 첫 번째 DriverVersion64비트 숫자는 입니다 4503600127348640. 여기는비트 AND( -band)는 변수 정의 중에 발생하며 $rev바이너리로 표시됩니다.

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                                        1111111111111111 (65535, aka "0xffff")
                                    =   0000111110100000 (4000)
                                                         (DriverVersion = X.Y.Z.4000)

여기 $build에는 -shr(비트 오른쪽으로 이동):

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                        1111111111111111                 (65535)
                    =   0001110111001101                 (7629)
                                                         (DriverVersion = X.Y.7629.4000)

여기 있습니다 $minor:

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
        1111111111111111                                 (65535)
    =   0000000000000000                                 (0)
                                                         (DriverVersion = X.0.7629.4000)

마지막으로, $major:

00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
11111111                                                 (65535)
00010000                                                 (16)
                                                         (DriverVersion = 16.0.7629.4000)

답변2

무엇이 우아하고, 무엇이 표현적이며, 무엇이 간결하고, 무엇이 비밀스러운지에 대해 논쟁할 여지가 많이 있습니다. 확실히 더 간단하지만 어떤 방식으로든 더 좋을 필요는 없습니다. 버전은 다음과 같습니다.

Get-PrinterDriver | Select-Object Name, @{ 
  n = "DriverVersion"
  e = {
        $ver = $_.DriverVersion
        (3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
      }
}

로마로 가는 또 다른 길.

관련 정보