Kommandozeilen QR-Code und Barcode-Leser für die PowerShell

In diesem Beitrag stellen wir einen QR-Code-Leser vor, der auf der Kommandozeile in PowerShell Skripten funktioniert. Darüber hinaus findet keine Übertragung der Bild-Datei an einen Web Service statt. Die lokale Verarbeitung ist insbesondere für sicherheitskritische QR-Codes, wie WLAN-Zugangsdaten1 oder OTP (One-Time Password)-Parameter für Zwei-Faktor-Authentifikationen, notwendig.

QR-Code-Leser

Möglich macht dies die .Net Library ZXing.Net2 von Michael Jahn, die auf einer Portierung der ursprünglich in Java implementierten Barcode-Leser und Generator Bibliothek zxing basiert. Damit das Skript funktioniert, muss ZXing.Net als erstes im GAC (Global Assembly Cache) installiert werden. Für die Installation wird das letzte auf GitHub veröffentlichte Release der Bibliothek benutzt:

# Install =====================================================================

# Installs the ZXing.Net library in the Global Assembly Cache (GAC). The ZXing.Net
# library supports decoding and generating of barcodes (like QR Code, PDF 417, EAN,
# UPC, Aztec, Data Matrix, Codabar) within images. ZXing.Net is a port of the java
# based barcode reader and generator library ZXing (see https://github.com/zxing/zxing)
# All credits for the library go to Michael Jahn (see https://github.com/micjahn/ZXing.Net
# for more information)
function Install-ZXing() {
    Require-AdministrativeRights
    Run-InPowershellDesktop

    Write-Host  "$($MyInvocation.MyCommand.Name): Install Barcode reader..."

    $json = $(Invoke-WebRequest -UserAgent "Wget" -Uri "https://api.github.com/repos/micjahn/ZXing.Net/releases/latest").Content | ConvertFrom-Json
    $json.Assets | %{
        # $_.browser_download_url
    
        if($_.browser_download_url -match 'ZXing.Net.[0-9]+.[0-9]+.[0-9]+.[0-9]+.zip') {
            # $Matches.0

            # Load ZXing.Net and expand zip archive
            Invoke-WebRequest -UserAgent "Wget" -Uri $_.browser_download_url -OutFile "$env:USERPROFILE\Downloads\$($Matches.0)"
            $s = [System.IO.Path]::GetFileNameWithoutExtension($Matches.0)
            md "$env:USERPROFILE\Downloads\$s" -Force | Out-Null
            Expand-Archive "$env:USERPROFILE\Downloads\$($Matches.0)" -DestinationPath "$env:USERPROFILE\Downloads\$s\" -Force

            # Remove old versions
            Remove-GAC("$env:USERPROFILE\Downloads\$s\net4.8\zxing.dll")

            # Install current version
            Install-GAC("$env:USERPROFILE\Downloads\$s\net4.8\zxing.dll")

            #Cleanup
            rm "$env:USERPROFILE\Downloads\$s\" -Recurse -Force -ErrorAction SilentlyContinue
            rm "$env:USERPROFILE\Downloads\$($Matches.0)" -Force -ErrorAction SilentlyContinue
        }
    }
}

Für die Installation muss das Skript mit administrativen Berechtigungen ausgeführt werden und verwendet die beiden Funktionen Install-GAC und Remove-GAC:

# Installs a dll in the Global Assembly Cache (GAC)
# REMARKS: Requires administrative rights
function Install-GAC([string]$path) {
    Add-Type -AssemblyName System.EnterpriseServices
    $pub = New-Object System.EnterpriseServices.Internal.Publish
    $pub.GacInstall($path)
}

# Removes a dll from the Global Assembly Cache (GAC)
# REMARKS: Requires administrative rights
function Remove-GAC([string]$path) {
    Add-Type -AssemblyName System.EnterpriseServices
    $pub = New-Object System.EnterpriseServices.Internal.Publish
    $pub.GacRemove($path)
}

Der Barcode-Leser verwendet die Klasse BarcodeReader der ZXing.Net Bibliothek, um den Text aus deinem Barcode oder QR-Code auszulesen:

# Read Bar- or QR-Code image file into a Bitmap
$stm = New-Object IO.FileStream $_, 'Open', 'Read'
$bmp = [System.Drawing.Bitmap]::FromStream($stm)    #Remarks: Use FromStream because FromFile doesn't close the stream after reading
$stm.Close()

# Decode barcode with ZXing.Net
$src = new-object ZXing.BitmapLuminanceSource($bmp)
$rd = new-object ZXing.BarcodeReader
$rd.AutoRotate = $true
$res = $rd.Decode($src)
Write-Verbose $res.Text

$res.Text

Für die Verarbeitung von Barcodes sind keine administrativen Berechtigungen mehr notwendig. Der BarcodeReader unterstütz die folgenden Formate: UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, ITF, Codabar, MSI, RSS-14 (all variants), QR Code, Data Matrix, Aztec and PDF-417. The encoder supports the following formats: UPC-A, EAN-8, EAN-13, Code 39, Code 128, ITF, Codabar, Plessey, MSI, QR Code, PDF-417, Aztec, Data Matrix.

Ausführung des Skriptes

Das Skript kann über die Kommandozeile mit der Barcode-Datei als Parameter aufgerufen werden:

Convert-Barcode.ps1 im Terminal

Zusätzlich kann der Schalter „-install“ dem Skript übergeben werden, der die Installation der ZXing.Net Bibliothek durchführt. Die Installation wird auch durchgeführt, wenn die Bibliothek nicht gefunden wurde. Die Installation wird immer mit der Windows PowerShell (Powershell.exe) und nicht der PowerShell (pwsh.exe) durchgeführt.

Downloads

Convert-Barcode.zip38,7 KBPowerShell Skript Convert-Barcode.ps1 und Beispiel QR-Code

Weitere Informationen