Overview
This section provides full examples of PowerShell scripts to demonstrate their usage and functionality.
As with C++ and C# development, a CoreScanner instance must first be opened, followed by the GetScanners method call to discover connected scanner devices. Clear here to learn more about the documentation.
Full Script Examples
Retrieve Asset Information
This script queries and logs the asset information of connected scanners.
# Description : Following script query the asset information of the connected scanners timely. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Log everything, file will create in the script execution folder.
# Comment the following line if logging is not required.
Start-Transcript -Append -Path $PSScriptRoot"\CoreScanner_AssetInfo.log.txt"
# Process GetScanners out XML and list the asset information
Function Process-Out-XML ($XML)
{
$XmlContent = New-Object -TypeName System.Xml.XmlDocument
$XmlContent.LoadXml($XML)
# Pipe asset information
$XmlContent.scanners.scanner | Format-Table -AutoSize @{Name = 'Scanner ID'; Expression = {$_.scannerID}},
@{Name = 'Host Mode'; Expression = {$_.type}},
@{Name = 'Model Number'; Expression = {$_.modelnumber}},
@{Name = 'Serial Number'; Expression = {$_.serialnumber}},
@{Name = 'Date of Manufacture'; Expression = {$_.DoM}},
@{Name = 'Scanner Firmware Version'; Expression = {$_.firmware}}
}
# Main script to execute
Invoke-Command -ScriptBlock {
# Initialize CoreScanner
Write-Output "$(Get-Date) Loading Interop.CoreScanner.dll";
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Initialize
$Status = 0;
$AppHandle = 0;
$OutXML = "";
$ScannerCount = 0;
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11;
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1;
$ScannerIDList = New-Object int16[] 255;
# Invoke Open API
$ScannerObject.Open($AppHandle, $ScannerTypes, $NumberOfScannerTypes, [ref] $Status);
Write-Output "$(Get-Date) Scanner.Open() Status: $Status";
# Invoke GetScanners API, process XML to query scanners
$ScannerObject.GetScanners([ref] $ScannerCount, $ScannerIDList, [ref] $OutXML, [ref] $Status)
Write-Output "$(Get-Date) GetScanners API Invoke Status: $Status";
Write-Output "$(Get-Date) Number of Connected Scanner(s) to the Host: $ScannerCount";
Process-Out-XML -XML $OutXML;
}
Retrieve Barcode Data Scan Events
This script sets up and handles barcode scan events using a C# wrapper.
# Description : Following script query the scanner barcode events. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Main script to execute
Invoke-Command -ScriptBlock {
add-Type -typedef @"
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace CoreScannerWrapperLib
{
public delegate void BarcodeEventHandler(int dataType, string pscanData);
/// <summary>
/// CoreScanner Wrapper for barcode events
/// </summary>
public class CoreScannerWrapper
{
public static event BarcodeEventHandler OnBarcode;
private const int EventTypeBarcode = 1;
private const short NumberOfScannerTypes = 1;
private const int StatusFalse = -1;
private Type objType;
private object coreScannerObject = null;
private int appHandle = 0;
private short[] scannerTypes = new short[NumberOfScannerTypes];
// Initialize CoreScanner COM object
public CoreScannerWrapper()
{
string progId = "CoreScanner.CoreScanner";
objType = Type.GetTypeFromProgID(progId);
coreScannerObject = Activator.CreateInstance(objType);
}
public int Open()
{
int status = StatusFalse;
short numberOfTypes = 1;
short[] scannerTypes = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
scannerTypes[0] = 1;
coreScannerObject.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null,
coreScannerObject, new object[]
{
appHandle,scannerTypes, numberOfTypes, status
});
RegisterForEvents();
return status;
}
public void RegisterForEvents()
{
string inXml = "";
string outXml = "";
long status = -1;
int opCodeRegisterForEvents = 1001;
int eventIdCount = 1; // Number of events to register (only barcode events)
int[] eventIdList = new int[eventIdCount];
// Register for barcode events only
eventIdList[0] = EventTypeBarcode;
string eventIds = String.Join(",", eventIdList);
inXml = "<inArgs>" +
"<cmdArgs>" +
"<arg-int>" + eventIdCount + "</arg-int>" + // Number of events to register
"<arg-int>" + eventIds + "</arg-int>" + // Event id list of events to register for
"</cmdArgs>" +
"</inArgs>";
// Call register for events
status=ExecCommand(opCodeRegisterForEvents, // Opcode: Register for events
inXml, // Input XML
out outXml // Output XML
); // Command execution success/failure return status
MethodInfo method =
this.GetType().GetMethod("BarcodeEvent",
BindingFlags.NonPublic | BindingFlags.Instance);
MethodInfo barcodeEventCallbackMethod = this.GetType().GetMethod("BarcodeEvent", BindingFlags.Public| BindingFlags.Instance);
BarcodeEventHandler callback = (BarcodeEventHandler) Delegate.CreateDelegate(typeof(BarcodeEventHandler), this, barcodeEventCallbackMethod, false);
Guid sourceId = new Guid("981E3D8B-C756-4195-A702-F198965031C6"); // CoreScanner events GUID
int dispId = 3; // Barcode data disp id
ComEventsHelper.Combine(coreScannerObject, sourceId, dispId, callback);
}
public void BarcodeEvent(int dataType, string pscanData)
{
if (OnBarcode != null)
{
OnBarcode(dataType, pscanData);
}
}
public int ExecCommand(int opCode, string inXml, out string outXml)
{
int status = StatusFalse;
outXml = "";
ParameterModifier[] mods = new ParameterModifier[] { new ParameterModifier(4) };
mods[0][2] = true;
mods[0][3] = true;
object[] parameters = new object[4];
parameters[0] = opCode;
parameters[1] = inXml;
parameters[2] = "";
parameters[3] = StatusFalse;
coreScannerObject.GetType().InvokeMember("ExecCommand", BindingFlags.InvokeMethod, null, coreScannerObject, parameters, mods, null, null);
outXml = (string)parameters[2];
status = (int)parameters[3];
return status;
}
public int Close()
{
int status = StatusFalse;
coreScannerObject.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null,
coreScannerObject, new object[]
{
appHandle, status
});
return status;
}
}
}
"@
# Add-Type -TypeDefinition $Source -Language CSharp
$ScanneWrapperObject = New-Object CoreScannerWrapperLib.CoreScannerWrapper;
Write-Output "Starting --------------------"
$Action = {
Write-Host $event.SourceArgs
}
Register-ObjectEvent -InputObject $ScanneWrapperObject -SourceIdentifier "BarcodeEvents" -EventName "OnBarcode" -Action $Action
$stat= $ScanneWrapperObject.Open();
Write-Output "Scan barcodes now --------------------"
for (($i = 0); $i -lt 10; $i++) {
Start-Sleep -Seconds 1
}
$stat= $ScanneWrapperObject.Close();
Write-Output "Closing CoreScanner";
Unregister-Event -SourceIdentifier "BarcodeEvents"
}
Scanner Configuration Load
This script loads the configurations into the scanner.
# Description : Following script loading the configuration into the scanner. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Initialize CoreScanner
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$global:ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Command return status codes
$global:StatusSuccess = 0
$global:StatusFailed = -1
$global:MultiScannerLoading = 0;
$global:SelectScannerID = 0;
# Display scanner information
# param $XML : scanner list xml to display
Function Process-Out-XML ($XML)
{
$XmlContent = New-Object -TypeName System.Xml.XmlDocument
$XmlContent.LoadXml($XML)
# Pipe asset information
$XmlContent.scanners.scanner | Format-Table -AutoSize @{Name = 'ID'; Expression = {$_.scannerID}},
@{Name = 'Host Mode '; Expression = {$_.type}},
@{Name = 'Model Number '; Expression = {$_.modelnumber}},
@{Name = 'Serial Number '; Expression = {$_.serialnumber}},
@{Name = 'Date of Manufacture '; Expression = {$_.DoM}},
@{Name = 'Firmware Version '; Expression = {$_.firmware}}
}
# Open CoreScanner
# param $CurrentHandle : Current application handle
# param $CommandStatus : Command success/fail return status
Function OpenScanner([ref] [int] $CurrentHandle,[ref][int] $CommandStatus) {
$hApp = 0;
$StatusValue = $StatusFailed
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1
# Open CoreScanner
$ScannerObject.Open($hApp, $ScannerTypes, $NumberOfScannerTypes, [ref] $StatusValue)
if ($StatusValue -eq $StatusSuccess) {
Write-Output "Open Success"
$CurrentHandle.Value=$hApp
} else {
Write-Output "Open Failed : error code :$StatusValue"
}
$CommandStatus.Value= $StatusValue
}
# Close CoreScanner
# param $CurrentHandle : Current application handle
# param $CommandStatus : Command success/fail return status
Function CloseScanner([int]$CurrentHandle,[ref] [int] $CommandStatus) {
$StatusValue = $StatusFailed;
# Close CoreScanner
$ScannerObject.Close($CurrentHandle, [ref] $StatusValue)
if ($StatusValue -eq $StatusSuccess) {
Write-Output "Close Success"
} else {
Write-Output "Close Failed : error code :$StatusValue"
}
$CommandStatus.Value= $StatusValue
}
# Process GetScanners out XML and list the asset information
# param $OutputXml : Output scanner list xml
# param $NumScanners : Connected scanner count
# param $CommandStatus : Command success/fail return status
Function GetScanners([ref] [string] $OutputXML, [ref] [int] $NumScanners, [ref] [int] $CommandStatus) {
$StatusValue = $StatusFailed
# GetScanners - scanner id list
$ScannerIDList = New-Object int16[] 255
# GetScanners - total scanner count
$CurrentScannerCount = 0
$CommandOutputXML=""
# Get List of scanners
$ScannerObject.GetScanners([ref] $CurrentScannerCount,$ScannerIDList, [ref] $CommandOutputXML, [ref] $StatusValue)
if ($StatusValue -eq $StatusSuccess) {
$OutputXML.Value = $CommandOutputXML
$NumScanners.Value = $CurrentScannerCount
Write-Output "GetScanners Success"
} else {
Write-Output "GetScanners Failed : error code :$StatusValue"
}
$CommandStatus.Value= $StatusValue
Write-Output "Number of Connected Scanner(s) to the Host: $ScannerCount"
Process-Out-XML -XML $CommandOutputXML
}
#Load Configuration to specified scanner
#param $inXml: Input xml with configuration file path
#param $CommandStatus : Command success/fail return status
Function LoadConfiguration($inXml,[ref] [int] $CommandStatus) {
Write-Output "Loading Configuration Started"
$StatusValue = $StatusFailed
$CommandOutputXML=""
$OpcodeLoadConfig = 5020 # load configuration opcode
$ScannerObject.ExecCommand($OpcodeLoadConfig, [ref] $inXml, [ref] $CommandOutputXML, [ref]$StatusValue)
$CommandStatus.Value= $StatusValue
}
if ($args.Count -eq 0) {
Write-Output "No configuration file specified : Usage : LoadScannerConfig.ps1 <scanner config file path> <specified scanner id (optional)>"
return
}
$ConfigFileName = $args[0]
if ($args.Count -eq 2) {
if ($args[1] -match '^\d+$') {
$SelectScannerID = [int]$args[1]
$MultiScannerLoading = 0
} else {
Write-Output "Invalid scanner ID specified. It must be a number."
return
}
} else {
$MultiScannerLoading = 1
}
$AppHandle = 0
$Status = $StatusFailed
$OutXML = ""
$ScannerCount = 0
$ConfigFileInvalid = 601
$DeviceIncompatible = 602
$ConfigFileFormatInvalid = 603
# Validate configuration file path
if (-not (Test-Path $ConfigFileName)) {
Write-Output "Config File not valid"
return
}
# Open CoreScanner
OpenScanner ([ref]$AppHandle) ([ref]$Status)
if ($Status -ne $StatusSuccess) {
Write-Output "CoreScanner Open Failed"
return
}
# Get connected scanners
GetScanners ([ref]$OutXML) ([ref]$ScannerCount) ([ref]$Status)
if ($Status -ne $StatusSuccess) {
Write-Output "GetScanners Failed : error code :$Status"
CloseScanner $AppHandle ([ref]$Status)
return
}
if ($ScannerCount -le 0) {
Write-Output "No scanners found"
CloseScanner $AppHandle ([ref]$Status)
return
}
$XmlScannerList = New-Object -TypeName System.Xml.XmlDocument
$XmlScannerList.LoadXml($OutXML)
Function Load-Config-To-Scanner {
param (
[int]$ScannerId,
[string]$ConfigFileName
)
$ConfigInXml = "<inArgs><scannerID>$ScannerId</scannerID><cmdArgs><arg-string>$ConfigFileName</arg-string></cmdArgs></inArgs>"
$Status = $StatusFailed
LoadConfiguration $ConfigInXml ([ref]$Status)
switch ($Status) {
$StatusSuccess { Write-Output "Configuration Load for Scanner : $ScannerId - Success" }
$ConfigFileInvalid { Write-Output "Configuration Load for Scanner : $ScannerId - Failed : Config File Invalid" }
$DeviceIncompatible { Write-Output "Configuration Load for Scanner : $ScannerId - Failed : Device Incompatible with Config File" }
$ConfigFileFormatInvalid { Write-Output "Configuration Load for Scanner : $ScannerId - Failed : Config File Format Invalid" }
default { Write-Output "Configuration Load for Scanner : $ScannerId - Failed : error code :$Status" }
}
}
if ($MultiScannerLoading -eq 0) {
# Single scanner loading: use selected scanner ID
Load-Config-To-Scanner -ScannerId $SelectScannerID -ConfigFileName $ConfigFileName
} else {
# Multi scanner loading: iterate all scanners
foreach ($scanner in $XmlScannerList.scanners.scanner) {
$CurrentScannerId = [int]$scanner.scannerID
Load-Config-To-Scanner -ScannerId $CurrentScannerId -ConfigFileName $ConfigFileName
}
}
# Close CoreScanner
CloseScanner $AppHandle ([ref]$Status)
Firmware Download
This script download the firmware into the scanner.
# Description : Following script download the firmware (Plug-in/DAT) into the scanner. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Log everything, file will create in the script execution folder.
Start-Transcript -Append -Path $PSScriptRoot"\CoreScanner_GetAttributes.log.txt"
Function Get-Scanner-Attribute-Values($XML)
{
$XmlContent = New-Object -TypeName System.Xml.XmlDocument
$XmlContent.LoadXml($XML)
# Pipe attribute list
$ScannerID = $XmlContent.outArgs.scannerID
Write-Output "Scanner ID : $ScannerID"
$XmlContent.outArgs.('arg-xml').response.attrib_list.attribute | Format-Table -AutoSize @{Name = 'Attribute ID'; Expression = {$_.id}},
@{Name = 'Name'; Expression = {$_.name}},
@{Name = 'Data Tyoe'; Expression = {$_.datatype}},
@{Name = 'Permission'; Expression = {$_.permission}},
@{Name = 'Value'; Expression = {$_.value}}
}
Function Sample()
{
Write-Output "RMD Events"
}
# Main script to execute
Invoke-Command -ScriptBlock {
# Initialize CoreScanner
Write-Output "$(Get-Date) Loading Interop.CoreScanner.dll";
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Initialize
$Status = 0;
$AppHandle = 0;
$OutXML = "";
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11;
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1;
Write-Output "$(Get-Date) Scanner.Open() Invoke";
$ScannerObject.Open($AppHandle, $ScannerTypes, $NumberOfScannerTypes, [ref] $Status);
Write-Output "$(Get-Date) Scanner.Open() Status: $Status";
# Register for RMD events
$InXML = "";
$InXML += "<inArgs>";
$InXML += "<cmdArgs>";
$InXML += "<arg-int>1</arg-int>"; # Number of event types to register. In this case only the RMD event type.
$InXML += "<arg-int>8</arg-int>"; # Event type.
$InXML += "</cmdArgs>";
$InXML += "</inArgs>";
# Opcode for register for events
$REGISTER_FOR_EVENTS = 1001;
Write-Output "$(Get-Date) Invoke ExecCommand - Register for Events.";
$ScannerObject.ExecCommand($REGISTER_FOR_EVENTS, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Write-Output $Status;
# Register event handler.....
#Register-ObjectEvent -InputObject $ScannerObject -EventName ScanRMDEvent -Action {Write-Host "EMD Event Recieved"}
$ScannerObject.add_ScanRMDEvent("Sample");
#.................................
# Opcode for firmware download.
$UPDATE_FIRMWARE_DAT = 5016;
$UPDATE_FIRMWARE_PLUGIN = 5017;
# Firmware DAT/Plug-in file path. Choose the correct opcode based on the file type.
# Following is the 123Scan default Plug-ins folder path.
$FIRMWARE_FILE_PATH = "C:\ProgramData\123Scan2\Plug-ins\DS9208\DS9208-COMMON DL MODELS-S\022\DS9208-COMMON DL MODELS-S-022.SCNPLG";
# Scanner ID. For the multiple scanner write a loop statement accoringly.
$SCANNER_ID = 1;
$InXML = "";
$InXML += "<inArgs>";
$InXML += "<scannerID>";
$InXML += $SCANNER_ID
$InXML += "</scannerID>";
$InXML += "<cmdArgs>";
$InXML += "<arg-string>";
$InXML += $FIRMWARE_FILE_PATH;
$InXML += "</arg-string>";
$InXML += "<arg-int>2</arg-int>";
$InXML += "</cmdArgs>";
$InXML += "</inArgs>";
Write-Output "$(Get-Date) Invoke ExecCommand - Firmware Download.";
$ScannerObject.ExecCommand($UPDATE_FIRMWARE_PLUGIN, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Write-Output $Status;
<#foreach($ScannerID in $ScannerIDList)
{
if($ScannerID -ne 0)
{
$InXML = ""
$InXML += "<inArgs>"
$InXML += "<scannerID>"
$InXML += $ScannerID
$InXML += "</scannerID>"
$InXML += "<cmdArgs><arg-xml><attrib_list>"
$InXML += $AttributeList -join ","
$InXML += "</attrib_list></arg-xml></cmdArgs>"
$InXML += "</inArgs>"
Write-Output "$(Get-Date) Invoke ExecCommand.";
$ScannerObject.ExecCommand(5001, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Get-Scanner-Attribute-Values($OutXML)
}
}#>
}
Get Attributes from the Scanner
This script query the attribute values of the given attributes on all the connected scanners.
# Description : Following script query the attribute values of the given attributes on all the connected scanners. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Log everything, file will create in the script execution folder.
Start-Transcript -Append -Path $PSScriptRoot"\CoreScanner_GetAttributes.log.txt"
Function Get-Scanner-Attribute-Values($XML)
{
$XmlContent = New-Object -TypeName System.Xml.XmlDocument
$XmlContent.LoadXml($XML)
# Pipe attribute list
$ScannerID = $XmlContent.outArgs.scannerID
Write-Output "Scanner ID : $ScannerID"
$XmlContent.outArgs.('arg-xml').response.attrib_list.attribute | Format-Table -AutoSize @{Name = 'Attribute ID'; Expression = {$_.id}},
@{Name = 'Name'; Expression = {$_.name}},
@{Name = 'Data Type'; Expression = {$_.datatype}},
@{Name = 'Permission'; Expression = {$_.permission}},
@{Name = 'Value'; Expression = {$_.value}}
}
# Main script to execute
Invoke-Command -ScriptBlock {
# Initialize CoreScanner
Write-Output "$(Get-Date) Loading Interop.CoreScanner.dll";
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Initialize
$Status = 0;
$AppHandle = 0;
$OutXML = "";
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11;
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1;
# Attribute list, comma separated
[int[]]$AttributeList = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
# Scanner IDs list, comma separated
[int[]]$ScannerIDList = 1
Write-Output "$(Get-Date) Scanner.Open() Invoke";
$ScannerObject.Open($AppHandle, $ScannerTypes, $NumberOfScannerTypes, [ref] $Status);
Write-Output "$(Get-Date) Scanner.Open() Status: $Status";
foreach($ScannerID in $ScannerIDList)
{
if($ScannerID -ne 0)
{
$InXML = ""
$InXML += "<inArgs>"
$InXML += "<scannerID>"
$InXML += $ScannerID
$InXML += "</scannerID>"
$InXML += "<cmdArgs><arg-xml><attrib_list>"
$InXML += $AttributeList -join ","
$InXML += "</attrib_list></arg-xml></cmdArgs>"
$InXML += "</inArgs>"
Write-Output "$(Get-Date) Invoke ExecCommand.";
$ScannerObject.ExecCommand(5001, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Get-Scanner-Attribute-Values($OutXML)
}
}
}
Set Attributes in the Scanner
This script set the attribute values of the given scanner.
# Description : Following script set the attribute values of the given scanner. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Log everything, file will create in the script execution folder.
Start-Transcript -Append -Path $PSScriptRoot"\CoreScanner_SetAttributes.log.txt"
Function Get-Scanner-Attribute-Values($XML)
{
$XmlContent = New-Object -TypeName System.Xml.XmlDocument
$XmlContent.LoadXml($XML)
# Pipe attribute list
$ScannerID = $XmlContent.outArgs.scannerID
Write-Output "Scanner ID : $ScannerID"
$XmlContent.outArgs.('arg-xml').response.attrib_list.attribute | Format-Table -AutoSize @{Name = 'Attribute ID'; Expression = {$_.id}},
@{Name = 'Name'; Expression = {$_.name}},
@{Name = 'Data Type'; Expression = {$_.datatype}},
@{Name = 'Permission'; Expression = {$_.permission}},
@{Name = 'Value'; Expression = {$_.value}}
}
# Main script to execute
Invoke-Command -ScriptBlock {
# Initialize CoreScanner
Write-Output "$(Get-Date) Loading Interop.CoreScanner.dll";
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Initialize
$Status = 0;
$AppHandle = 0;
$OutXML = "";
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11;
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1;
# Attribute list, comma separated
$AttributeList = @(("0", "F", "True"), ("1", "F", "True"), ("2", "F", "True"))
# Scanner IDs list, comma separated
[int[]]$ScannerIDList = 1
Write-Output "$(Get-Date) Scanner.Open() Invoke";
$ScannerObject.Open($AppHandle, $ScannerTypes, $NumberOfScannerTypes, [ref] $Status);
Write-Output "$(Get-Date) Scanner.Open() Status: $Status";
foreach($ScannerID in $ScannerIDList)
{
if($ScannerID -ne 0)
{
$InXML = "<inArgs>"
$InXML += "<scannerID>"
$InXML += $ScannerID
$InXML += "</scannerID>"
$InXML += "<cmdArgs><arg-xml><attrib_list>"
#$InXML += $AttributeList -join ","
foreach($AttributeValue in $AttributeList)
{
$InXML += "<attribute>"
$InXML += "<id>"
$InXML += $AttributeValue[0]
$InXML += "</id>"
$InXML += "<datatype>"
$InXML += $AttributeValue[1]
$InXML += "</datatype>"
$InXML += "<value>"
$InXML += $AttributeValue[2]
$InXML += "</value>"
$InXML += "</attribute>"
}
$InXML += "</attrib_list></arg-xml></cmdArgs>"
$InXML += "</inArgs>"
Write-Output "$(Get-Date) Invoke ExecCommand.";
$ScannerObject.ExecCommand(5004, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Write-Output "$(Get-Date) SetAttribute command status : $Status";
}
}
}
Scanner Host Mode Switching
This script switch all the connected scanners into the given host mode.
# Description : Following script switch all the connected scanners into the given host mode. Support PSVersion 5+.
# Copyright : ©2025 Zebra Technologies Corp. and/or its affiliates.
# Log everything, file will create in the script execution folder.
# Comment the following line if logging is not required.
Start-Transcript -Append -Path $PSScriptRoot"\CoreScanner_SwitchHostMode.log.txt"
# Main script to execute
Invoke-Command -ScriptBlock {
# Initialize CoreScanner
Write-Output "$(Get-Date) Loading Interop.CoreScanner.dll";
[System.Reflection.Assembly]::LoadFile("C:\Program Files\Zebra Technologies\Barcode Scanners\Common\Interop.CoreScanner.dll")|Out-Null;
$ScannerObject = New-Object Interop.CoreScanner.CCoreScannerClass;
# Initialize
$Status = 0;
$AppHandle = 0;
$OutXML = "";
$InXML = "";
$ScannerCount = 0;
# For all scanners, set to 1
$ScannerTypes = New-Object int16[] 11;
$ScannerTypes[0] = 1;
# For all scanner types, set to 1
$NumberOfScannerTypes = [int16] 1;
# Scanner IDs list, comma separated
[int[]]$ScannerIDList = 1
# Host modes
$HOST_MODE_USB_IBMHID = "XUA-45001-1"
$HOST_MODE_USB_IBMTT = "XUA-45001-2"
$HOST_MODE_USB_HIDKB = "XUA-45001-3"
$HOST_MODE_USB_OPOS = "XUA-45001-8"
$HOST_MODE_USB_SNAPI_WITH_IMAGING = "XUA-45001-9"
$HOST_MODE_USB_SNAPI_WITHOUT_IMAGING = "XUA-45001-10"
$HOST_MODE_USB_CDC = "XUA-45001-11"
# Invoke Open API
$ScannerObject.Open($AppHandle, $ScannerTypes, $NumberOfScannerTypes, [ref] $Status);
Write-Output "$(Get-Date) Scanner.Open() Status: $Status";
foreach($ScannerID in $ScannerIDList)
{
if($ScannerID -ne 0)
{
$InXML += "<inArgs>"
$InXML += "<scannerID>"
$InXML += $ScannerID
$InXML += "</scannerID>"
$InXML += "<cmdArgs>"
$InXML += "<arg-string>"
$InXML += $HOST_MODE_USB_IBMHID # Host mode to switch
$InXML += "</arg-string>"
$InXML += "<arg-bool>FALSE</arg-bool>" # Silent switch, True - enable, False - disable
$InXML += "<arg-bool>FALSE</arg-bool>" # Permanent change, True - enable, False - disable
$InXML += "</cmdArgs>"
$InXML += "</inArgs>"
}
}
# Switch scanner host mode
$ScannerObject.ExecCommand(6200, [ref] $InXML, [ref] $OutXML, [ref] $Status)
Write-Output "$(Get-Date) Switched to SNAPI status : $Status";
}