Пакетный вывод сценария в текстовый файл с частичным дублированием - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть задача запросить некоторые имена хостов для их серийного номера, хранящегося в BIOS.У меня есть имена хостов в текстовом файле, обрабатываются с помощью цикла for, клиенты запрашивают серийный номер с другим циклом for, а результат направляется в другой текстовый файл.

Это не проблема, если хост отключен или не отвечает.Имя хоста записывается в текстовый файл, серийный номер остается пустым, и сценарий затем переходит к следующей записи во входном файле.Но если хост отвечает, и в переменной сохраняется серийный номер, сценарий сначала записывает в выходной файл, как и положено, но затем он записывает другую строку с тем же именем хоста и пустым серийным номером, прежде чем перейти к следующей строке ввходной файл.

@ECHO OFF

set list=c:\temp\input.txt

for /F %%C in (%list%) do (
    for /F "skip=1" %%S in ('wmic /node:%%C bios get serialnumber') do ( 
        echo %%C - %%S >>c:\temp\output.txt)
    )

pause

Это приводит к выводу, который выглядит следующим образом:

DC6068WA00829 -  
DC6054WA00178 -  
DC6061WA00065 - R93NSI3
DC6061WA00065 -  
DC6061WA00064 - R0KBN3S
DC6061WA00064 -  
DC6023LA034284 -  
DC6038LA034272 -  

Как вы можете видеть, когда хост не отвечает, потому что он отключен или не может связаться ни с чемпричина, это переходит к следующему так же, как и должно.Но когда кто-то отвечает, он сразу же записывает другую строку, используя только имя хоста и тире.

Я попытался сделать команду записи в выходной файл отдельным вызовом подпрограммы, я попытался удалить записьпеременная %% S, чтобы увидеть, не мешает ли это каким-то образом, я пытался сохранить результаты в различных переменных перед выводом их в файл, но ничего не меняет.

Я могу очистить полученную информациюфайл без особых проблем.В основном я просто хочу знать, чего мне не хватает, что могло бы вызвать это.

Буду признателен за любую помощь или понимание.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Вы заметите, что когда вы запускаете сами:

wmic /node:somehostname bios get serialnumber

В нем по-прежнему есть символы Unicode cr / lf, которые вы не можете видеть в терминале подсказки cmd, поскольку они отображаются в виде пустых строк. Это, однако, приводит к тому, что символы назначаются мета-переменной %%C и снова запускает цикл для этих символов, отображая обе записи в вашем файле. Вместо этого мы проверяем, существует ли переменная, и создаем ее, если нет, что убедитесь, что мы назначаем только фактическое значение. Обратите внимание, что мы используем delayedexpansion здесь, как мы set ting и используем переменные внутри блока кода.

@echo off
setlocal enabledelayedexpansion
set "list=C:\temp\input.txt"

type nul>"C:\Temp\output.txt"
for /F %%C in (%list%) do (
    for /F "skip=1" %%S in ('wmic /node:%%C bios get serialnumber') do if not defined serial set "serial=%%C - %%S"
        echo(!serial!>>"C:\temp\output.txt"
)
type output.txt
pause

Примечание

Я создал type nul>"C:\Temp\output.txt", чтобы гарантировать, что мы не добавляем предыдущие запуски скрипта, если вы хотите добавить его, удалите эту строку.

0 голосов
/ 23 апреля 2019
Вывод
  • wmic.exe ограничен необычным окончанием строки cr/cr/lf,
    в результате ошибочного преобразования в юникод.
  • for /f будет пропускать пустые строки, но не может сэти cr/cr/lf последовательности
    , так что выводятся только эти строки с %%C.
  • одно решение - другое for, анализируя верхний регистр %%S с %%s
  • техническивсе for /f являются одной строкой:

:: Q:\Test\2019\04\23\SO_55804785.cmd
@ECHO OFF
set "FileIn=c:\temp\input.txt"
set "FileOut=c:\temp\output.txt"

for /F "usebackq delims=" %%C in (
    "%FileIn%"
) do for /F "skip=1 delims=" %%S in (
    'wmic /node:%%C bios get serialnumber 2^>Nul ^|findstr "^." '
) do for /F "delims=" %%s in (
    "%%S"
) do echo %%C - %%s >>"%FileOut%"

pause
...