Пакетная команда DOS для чтения некоторой информации из текстового файла

Я пытаюсь считать некоторую информацию из текстового файла при помощи командной строки окон и сохранить его к переменной точно так же, как "информация о наборе =1234"

Ниже содержание txt файла, на самом деле мне просто нужно число пересмотра, и местоположение его всегда является той же строкой 5, и из столбца 11 - 15. В образце это - 1234, и я задаюсь вопросом, там способ сохранить его к переменной в командной строке DOS.

Большое спасибо!

svninfo.txt:

Path: .
URL: https://www.abc.com
Repository Root: https://www.abc.com/svn
Repository UUID: 12345678-8b61-fa43-97dc-123456789
Revision: 1234
Node Kind: directory
Schedule: normal
Last Changed Author: abc
Last Changed Rev: 1234
Last Changed Date: 2010-04-01 18:19:54 -0700 (Thu, 01 Apr 2010)
5
задан Ray 2 April 2010 в 23:01
поделиться

5 ответов

Вот однострочная версия:

for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
  1. findstr используется для фильтрации файла. Он напечатает "input.txt: Revision: 1234"
  2. Тогда "tokens = 2" означает, что нас интересует второй токен, "1234". По умолчанию для разрывов на пустом пространстве.
11
ответ дан 18 December 2019 в 08:27
поделиться

, если у вас есть, можете использовать инструменты GNU, такие как gawk

@echo off
for /F %%a in ('gawk -F":" "$1~/Revision/{print $2}" file') do (
        set var=%%a
)
echo %var%
1
ответ дан 18 December 2019 в 08:27
поделиться

Знание того, как ловко использовать сценарии CMD, - это здорово, но использование PowerShell даже лучше. Вот один из способов сделать это:

$revision = (( gc .\svninfo.txt | ? { $_.StartsWith( 'Revision: ' ) } ) -split ' ')[1]

Что происходит?

$ revision - это переменная

gc is Get-Content , также известная как type ]. Каждая строка в файле становится строкой в ​​последовательности (конвейере).

? равно Where-Object . Он фильтрует объекты в конвейере на основе условия.

{} разделяет блок сценария

$ _ - текущий объект в конвейере.

-split вызывает String.Split () в .NET, предоставляя вам массив объектов

[1] индексов в массиве

1
ответ дан 18 December 2019 в 08:27
поделиться

Следующий фрагмент кода показывает, как это сделать:

@echo off
setlocal enableextensions enabledelayedexpansion
set revision=
for /f "delims=" %%a in (input.txt) do (
    set line=%%a
    if "x!line:~0,10!"=="xRevision: " (
        set revision=!line:~10!
    )
)
echo !revision!
endlocal

Его вывод будет 1234 , как и нужно.

setlocal - это то, что я использую в каждом скрипте, чтобы гарантировать, что переменные обрабатываются известным способом. Оператор for обрабатывает каждую строку во входном файле (бит delims предотвращает разметку строки на отдельные слова).

! Line: ~ биты - это подстроки с ! Line: ~ 0,10! - первые десять символов и ! Строка: ~ 10! остальное.

По сути, он проверяет каждую строку, чтобы увидеть, начинается ли она с «Revision:» , и, если да, извлекает оставшуюся часть строки для дальнейшего использования.

4
ответ дан 18 December 2019 в 08:27
поделиться

Используйте команду for , чтобы проанализировать файл:

for /f "skip=4 tokens=2" %%l in (svninfo.txt) do (
    set revision=%%l
    goto gotrev
)

:gotrev
echo revision is %revision%
2
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: