Получить данные из txt через powershell, если параметр имеет значение true - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть скрипт powershell, который я запускаю с командным файлом (с повышенными правами) для установки сетевого принтера. Я настроил 37 сценариев, и большая часть кода в этих сценариях повторяется, поэтому я пытаюсь создать один универсальный сценарий, который будет устанавливать принтер по номеру комнаты ввода, включая текстовый файл, в котором будет храниться вся информация о принтере.

Это командный файл:

@echo off
set /p room_number=What is the room number: 

if exist "...\%room_number%.ps1" (
    Powershell.exe -executionpolicy remotesigned -File "...\%room_number%.ps1" "%room_number%"
)
else (
    echo.
    echo Powershell script for the printer in the room you specified has not been configured yet. You will need to add the printer maunally!
    explorer shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}
    pause
)

Это новый текстовый файл, над которым я работал:

roomnumber=1001
prdrloc=hp-lj-m401dn
prdrname=HP LaserJet 400 M401 PCL 6
hostname=TEST1
IP=192.168.7.10
devname=HP LaserJet Pro 400 M401dn-ROOM

roomnumber=1002
prdrloc=hp-lj-m404dn
prdrname=HP LaserJet Pro M404-M405 PCL-6 (V4)
hostname=TEST2
IP=192.168.7.11
devname=HP LaserJet Pro M404dn-ROOM

Это сценарий powershell, в котором я пытаюсьвключить TXT-файл, но я не знаю, как получить только информацию, касающуюся комнаты, которую я указал.

# Room_number_1001
param($room_number)
$file = "...\printer_info.txt"
foreach($line in (Get-Content $file)) {
    $a = $line.Split("=")
    New-Variable -Name $a[0] -Value $a[1]
}
Get-ChildItem "...\$prdrloc" -Filter *.inf -Recurse | % {pnputil.exe /a $_.FullName}
Add-PrinterDriver -Name "$prdrname" -Verbose
Add-PrinterPort -Name "$hostname" -PrinterHostAddress "$IP" -Verbose
Add-Printer -PortName "$hostname" -Name "$devname" -DriverName "$prdrname"
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name "LegacyDefaultPrinterMode" -Value 1 -Force
$PrinterName="$devname"
$DefaultPrinter = Get-WmiObject Win32_Printer -Filter "Name='$PrinterName'"
$DefaultPrinter.SetDefaultPrinter()

Любая помощь будет высоко ценится. Спасибо, парни. :)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Скептик, спасибо за ваш ответ. Это не совсем решило мою проблему, но вы отправили меня в поисках решения в правильном направлении. Я реализовал предложение CSV. :)

Я опубликую свой новый командный файл, скрипт csv и powershell, который дал мне нужный мне результат.

Пакет:

@echo off
setlocal enabledelayedexpansion
set /p room_number=What is the room number: 
set /A counter=0

for /f "usebackq tokens=1-6 delims=;" %%a in ("...\printerinfo.csv") do (
    if "%%a" == "%room_number%" (
        set /A counter=1
        Powershell.exe -executionpolicy remotesigned -File "...\printerscript.ps1" "%room_number%"
    )
)
if "%counter%"=="0" (
    echo.
    echo Powershell script for the printer in the room you specified has not been configured yet. You will need to add the printer maunally!
    explorer shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}
    pause
)

CSV-файл:

room_nmb;prdr_loc;prdr_name;host_name;ip_address;dev_name
1001;hp-lj-m401dn;HP LaserJet 400 M401 PCL 6;TEST1;192.168.7.10;HP LaserJet Pro 400 M401dn-ROOM
1002;hp-lj-m404dn;HP LaserJet Pro M404-M405 PCL-6 (V4);TEST2;192.168.7.11;HP LaserJet Pro M404dn-ROOM

Сценарий Powershell:

param($room_number)

$roomnmb = @()
$prdrloc = @()
$prdrname = @()
$hostname = @()
$ip = @()
$devname = @()

Import-csv "...\printerinfo.csv" -delimiter ";" |
ForEach-Object {
    $roomnmb = $_.room_nmb

    if ($roomnmb -contains $room_number) {
        $prdrloc = $_.prdr_loc
        $prdrname = $_.prdr_name
        $hostname = $_.host_name
        $ip = $_.ip_address
        $devname = $_.dev_name

        Get-ChildItem "...\$prdrloc" -Filter *.inf -Recurse | % {pnputil.exe /a $_.FullName}
        Add-PrinterDriver -Name "$prdrname" -Verbose
        Add-PrinterPort -Name "$hostname" -PrinterHostAddress "$ip" -Verbose
        Add-Printer -PortName "$hostname" -Name "$devname" -DriverName "$prdrname"
        Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name "LegacyDefaultPrinterMode" -Value 1 -Force
        $DefaultPrinter = Get-WmiObject Win32_Printer -Filter "Name='$devname'"
        $DefaultPrinter.SetDefaultPrinter()
    }
}

Приветствие.

0 голосов
/ 07 ноября 2019

Во-первых, я бы положил ваши данные в CSV. В Powershell будет проще и проще работать с

Like this

$PrinterData = Import-Csv -Path '\path to printer config csv file'
$RoomRequired = '1001'
$PrinterData | Where-Object {$_.RoomNumber -in $RoomRequired} | ForEach-Object {
    Get-ChildItem "...\$_.prdrloc" -Filter *.inf -Recurse | % {pnputil.exe /a $_.FullName}
    Add-PrinterDriver -Name $_.prdrname -Verbose
    Add-PrinterPort -Name $_.hostname -PrinterHostAddress $_.IP -Verbose
    Add-Printer -PortName $_.hostname -Name $_.devname -DriverName $_.prdrname
    Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name "LegacyDefaultPrinterMode" -Value 1 -Force
    $PrinterName= $_.devname
    $DefaultPrinter = Get-WmiObject Win32_Printer -Filter "Name='$Print
}

Вы можете сделать $RoomRequired массивом номеров комнат, например:$RoomRequired = @("1001","1002"), если вы хотите сделать несколько комнат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...