1

Тема: CMD: Запись диапазона строк в файл через Pipe

Есть 7z.exe, архив c текстом. Нужно одной командой вытащить из него первые N строк.
Нерабочая заготовка:

cmd /c chcp 1251&7z x Archive.7z -so|echo P 3|more /c /E>File.txt

Реально с more осуществить?

2 (изменено: Yury, 2016-06-01 00:17:26)

Re: CMD: Запись диапазона строк в файл через Pipe

Реально с more осуществить?

Нереально.

Но решение существует.

Вариант 1:

cmd /c 7z x "Archive.7z" -so^| ^>"File.txt" cmd /v/c "for /f %%i in ('find/n /v ""') do @set x=%%i& >nul set/a i+=1& if !i! leq 3 (echo(!x:*]=!) else exit/b"

.

Вариант 2:

cmd /c 7z x "Archive.7z" -so^| ^>"File.txt" cmd /v/c "for /f %%i in ('find/n /v ""') do @set x=%%i& for /f "delims=[]" %%j in ("%%i") do @if %%j leq 3 (echo(!x:*]=!) else exit/b"do @if %%j leq 3 (echo[!x:*]^^=!) else exit/b"

.

3

Re: CMD: Запись диапазона строк в файл через Pipe

Yury
Ясно. Спасибо за труды!
Проценты пришлось менять на одинарные, см. префикс.
Это ладно. В результате имеем только первые слова до пробела.

4 (изменено: Yury, 2016-05-31 23:04:30)

Re: CMD: Запись диапазона строк в файл через Pipe

Вариант 1:

cmd /c 7z x "Archive.7z" -so^| ^>"File.txt" cmd /v/c "for /f "delims=" %i in ('find/n /v ""') do @set x=%i& >nul set/a i+=1& if !i! leq 3 (echo(!x:*]=!) else exit/b"

.

Вариант 2:

cmd /c 7z x "Archive.7z" -so^| ^>"File.txt" cmd /v/c "for /f "delims=" %i in ('find/n /v ""') do @set x=%i& for /f "delims=[]" %j in ("%i") do @if %j leq 3 (echo(!x:*]=!) else exit/b"

.

5

Re: CMD: Запись диапазона строк в файл через Pipe

ОК. Хорошо. В исходном виде работает. Остановимся тогда на варианте покороче. Но если указать полные пути в кавычках к утилите и архиву с пробелами, то видим ругань на обрубок.

6

Re: CMD: Запись диапазона строк в файл через Pipe

cmd /v/c set y="C:\Program Files\7-Zip\7z.exe"^& !y! x "A r c h i v e.7z" -so^| ^>"File.txt" cmd /v/c "for /f "delims=" %i in ('find/n /v ""') do @set x=%i& >nul set/a i+=1& if !i! leq 3 (echo(!x:*]=!) else exit/b"

7

Re: CMD: Запись диапазона строк в файл через Pipe

ОК. Годится. Медленно, правда (поэтому и хотел через more /E). Добавил ещё туда chcp 1251^&, чтобы из юникодного файла кириллица нормально встала.

8

Re: CMD: Запись диапазона строк в файл через Pipe

Не буду утверждать, что это решение отличается от ранее предложенных, потому что в однострочники трудно вчитываться и стараться понять их логику.



set "m_filename=%windir%\System32\drivers\etc\hosts"

set /a "m_begin=1"
set /a "m_end=10"

set /a "m_skip=m_begin-1"
set /a "m_length=m_end-m_begin+1"

for /f "tokens=1,* delims=[]" %%f in ( '
	more +%m_skip% "%m_filename%" ^| find /n /v ""
' ) do (
	if %%f gtr %m_length% goto :done
	echo:%%g
)
:done

PowerShell в круг доступных средств не входит? На нем можн обыло бы сделать нечто подобное head/tail/sed именно под эту задачу.

( 2 * b ) || ! ( 2 * b )

9

Re: CMD: Запись диапазона строк в файл через Pipe

Rumata, префикс CMD (без BAT) и "Нужно одной командой" (строкой). UP.
Это необходимо не для частного случая. PowerShell не годится.