Как читать разное содержимое из текстового файла - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно прочитать идентификатор из файла, подобного этому:

BitLocker Drive Encryption: Configuration Tool version 10.0.16299
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

Volume C: [OSDisk]
All Key Protectors

    External Key:
      ID: {31116007-D1FB-43CC-A89C-927487BD5F00}
      External Key File Name:
        31116007-D1FB-43CC-A89C-927487BD5F00.BEK

    Numerical Password:
      ID: {C7948F32-F2F0-4E55-AD2E-06E982DFDB4F}
      Password:
        xxxx-xxxxx-xxxxx-xxxxxx-xxxxx-xxxx-xxxxx-xxx
    TPM:
      ID: {6497FF93-F678-4317-B5D7-423E9D682BF0}
      PCR Validation Profile:
        0, 2, 4, 8, 9, 10, 11

, а затем выполнить следующую команду, чтобы экспортировать ключи в AD для всех идентификаторов

manage-bde -protectors -adbackup c: -id {C7948F32-F2F0-4E55-AD2E-06E982DFDB4F}

Ответы [ 6 ]

1 голос
/ 28 апреля 2019

чистый пакетный скрипт, который использует тот факт, что вы ищете ключ сразу после «триггерной строки» (Numerical Password:)

@echo off
setlocal
set "flag="
for /f "tokens=*" %%a in (t.txt) do (
   if defined flag (for %%b in (%%a) do set "key=%%b") & goto :found
   if "%%a" == "Numerical Password:" set "flag=yes"
)
echo not found & goto :eof
:found
echo %key%
1 голос
/ 28 апреля 2019
FOR /f "tokens=2delims={}" %%a IN ('findstr /x /r /c:"  *ID: {.*}" "%filename1%"') DO ECHO manage-bde -protectors -adbackup c: -id {%%a}

, где filename1 содержит проверяемое имя файла, а команда echo ed.Удалите ключевое слово echo, чтобы выполнить manage-bde.

. findstr ищет строки, которые в точности соответствуют шаблону [spaces]ID: {string}, назначает строку от {} до %% a, затем отображает требуемыйкомандная строка, повторно применяя {}

1 голос
/ 27 апреля 2019

Если вы не хотите использовать для этого другой встроенный язык сценариев, а для чтения вашего файла используются стандартные окончания строк в Windows, у меня есть альтернативная идея.

Вместо прямого поиска строк сID: {…, вы можете найти <Anything><Carriage Return><Line Feed><Space(s)><Password:>. Вы могли бы дополнительно уточнить <Anything>, если вы чувствуете необходимость, но в этом случае я не думаю, что это необходимо :

@Echo Off
SetLocal DisableDelayedExpansion
Set "Src=input.txt"
Set "Str=Password:"
Set "ID="
(Set LF=^
% 0x0A %
)
For /F %%A In ('Copy /Z "%~f0" Nul')Do Set "CR=%%A"
SetLocal EnableDelayedExpansion
FindStr /RC:".*!CR!*!LF! *%Str%" "%Src%">"%TEMP%\_$.tmp"
EndLocal
For /F "UseBackTokens=2Delims={}" %%A In ("%TEMP%\_$.tmp")Do Set "ID={%%A}"
Del "%TEMP%\_$.tmp"
If Not Defined ID GoTo :EOF
manage-bde -protectors -adbackup c: -id %ID%

В приведенном выше примере я использовал input.txtв качестве имени текстового файла, который вы читаете, измените его, если необходимо.

0 голосов
/ 27 апреля 2019

РЕДАКТИРОВАТЬ: я упустил это из виду all IDs и создал решение на основе строки примера

Следующий лайнер PowerShell будет извлекать идентификатор из текстового файла .\BitLocker.txt

PoSh> Select-String -Path .\BitLocker.txt -Pattern 'Numerical Password' -Context 0,1|ForEach-Object {($_.Context.Postcontext.Trim() -split ' ')[1]}
{C7948F32-F2F0-4E55-AD2E-06E982DFDB4F}

Чтобы быть в теме, упакованной в пакет:

@Echo off
For /f "usebackq delims=" %%A in (`
    powershell -NoP -C "Select-String -Path .\BitLocker.txt -Pattern 'Numerical Password' -Context 0,1|% {($_.Context.Postcontext.Trim() -split ' ')[1]}"
 `) Do Set "ID=%%A"
 manage-bde -protectors -adbackup c: -id %ID%
0 голосов
/ 26 апреля 2019

Вы можете получить то, что хотите, с помощью регулярных выражений и FindStr. Частичное решение, так как я ленивее вас. ;)

c:\projects>findstr {[0-9A-F/-]*}  data.txt
  ID: {31116007-D1FB-43CC-A89C-927487BD5F00}
  ID: {C7948F32-F2F0-4E55-AD2E-06E982DFDB4F}
  ID: {6497FF93-F678-4317-B5D7-423E9D682BF0}
0 голосов
/ 26 апреля 2019

Возможно, использовать сценарий Windows для решения задачи?Это можно выполнить напрямую, используя wscript, или из пакетного файла, используя cscript:

cscript //nologo myscript.js

var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile("C:\\myfile.txt", 1);
var content = file.readAll();
// Do something with file content
file.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...