Пакетная команда DOS для чтения некоторой информации из текстового файла - PullRequest
5 голосов
/ 03 апреля 2010

Я пытаюсь прочитать некоторую информацию из текстового файла с помощью командной строки Windows и сохранить ее в переменную, например, "set info = 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 ]

11 голосов
/ 03 апреля 2010

Вот версия в одну строку:

for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
  1. findstr используется для фильтрации файла. Будет напечатано "input.txt: Редакция: 1234"
  2. Тогда «токены = 2» означают, что нас интересует второй токен, «1234». По умолчанию для перерывов на пустое пространство.
4 голосов
/ 03 апреля 2010

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

@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! - первые десять символов, а !line:~10! - остальные.

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

2 голосов
/ 03 апреля 2010

Используйте команду for для разбора файла:

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

:gotrev
echo revision is %revision%
1 голос
/ 03 апреля 2010

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

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

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

$revision является переменной

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

? - это Where-Object. Фильтрует объекты в конвейере по условию.

{} разграничивает блок скрипта

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

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

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

1 голос
/ 03 апреля 2010

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

@echo off
for /F %%a in ('gawk -F":" "$1~/Revision/{print $2}" file') do (
        set var=%%a
)
echo %var%
...