Любой язык - [решено] Удалить первый байт в файле

Аватара пользователя
m0nkrus

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение m0nkrus »

Цитата m0nkrus:



Только и успеваю увидеть красный цвет надписи.
Любой язык - [решено] Удалить первый байт в файле




Скрипт можно выполнить непосредственно в консоли, тогда она не будет закрыта и ошибку можно будет и прочитать, и скопировать.
Аватара пользователя
m0nkrus

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение m0nkrus »

YuS_2, не знал про это. Привык, что в cmd в консоль перенести готовый сценарий нельзя...



Ваш скрипт на семерке выдавал такую ошибку:

Код: Выделить всё

Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "file".
строка:1 знак:16
+ dir $root -file <<<<  -rec|%{
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "file".
строка:6 знак:16
+ dir $root -file <<<<  -rec|%{
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Аватара пользователя
DJ Mogarych

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение DJ Mogarych »

Судя по всему, у вас старый Powershell. Проверяется командой



Код:

Его можно обновить до версии 5.1

https://docs.microsoft.com/ru-ru/pow...powershell-7.1
Аватара пользователя
YuS_2

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение YuS_2 »

Цитата m0nkrus:



Не удается найти параметр, соответствующий имени параметра "file".
Любой язык - [решено] Удалить первый байт в файле




Это значит, что версия powershell 2.0, её надо обновить до 5.1, либо вместо параметра -file, в первом командлете, добавить в конвейер:



Код:

Код: Выделить всё

|?{!$_.PSIsContainer}

т.е. в целом, код выглядеть будет так:



Код:

Код: Выделить всё

$root = 'd:\test'
dir $root -rec|?{!$_.PSIsContainer}|%{
    $bytes = [io.file]::readallbytes($_.fullname)
    [io.file]::writeallbytes($_.fullname, $bytes[1..($bytes.count-1)])
}
Аватара пользователя
m0nkrus

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение m0nkrus »

DJ Mogarych, YuS_2, совершенно верно. Версия 2.0. Обновил до 5.1 и скрипты заработали корректно на семерке. Спасибо!
Аватара пользователя
YuS_2

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение YuS_2 »

Цитата m0nkrus:



Задача не разовая, увы.
CMD/BAT - автоматический поиск и замена HEX в файлах




Ну тогда, как-то так:



Код:

Код: Выделить всё

param (
	[string]$folder = '.\TEST'
)
function RW-Stream {
	param (
		[Parameter(ValueFromPipeline)]
		[ValidateNotNullOrEmpty()]
		$filein,
		$fileout = 'tmp.tmp'
	)
	begin {
		new-variable -name block -val 524288
		$buf = new-object byte[] ($block)
	}
	process {
		#measure-command{
		$reader = [io.streamreader]::new($filein.fullname)
		$writer = [io.streamwriter]::new($fileout)
		$reader.basestream.position = 1
		while ($reader.basestream.position -lt $reader.basestream.length){
			$cnt = $reader.basestream.read($buf,0,$block)
			$writer.basestream.write($buf,0,$cnt)
		}
		$reader.dispose();$writer.dispose()
		$reader.close();$writer.close()
		mi $fileout $filein.fullname -force
		#}
	}
}
dir $folder -file -rec|rw-stream

- скрипт принимает в качестве параметра наименование корневого каталога (можно указать абсолютный путь).

Корневой каталог сканируется рекурсивно. Целевые файлы заменяют исходные, то бишь копии нигде не создаются, поэтому применять осторожно, если исходные файлы потребуются в неизменном виде.



Файл ~250Мб, обрабатывается:

TotalSeconds : 7,5637454



Файл ~4,2Гб, обрабатывается:

TotalSeconds : 145,7682588
Аватара пользователя
m0nkrus

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение m0nkrus »

YuS_2, рекурсивно получаю ошибку:


Цитата:



You cannot call a method on a null-valued expression.

At E:\Design&Graphics\Unpack\onebyte.ps1:22 char:4

+ $cnt = $reader.basestream.read($buf,0,$block)

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [], RuntimeException

+ FullyQualifiedErrorId : InvokeMethodOnNull



Единственное, что менял в скрипте, это ".\TEST" заменил на "c:\test"
Аватара пользователя
YuS_2

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение YuS_2 »

Цитата m0nkrus:



рекурсивно получаю ошибку
Любой язык - [решено] Удалить первый байт в файле




Всё время забываю проверить на powershell v5.1, тестирую на pwsh 7.2, а у них есть различия...

В общем, там строчку надо удалить было



Код:

Код: Выделить всё

$filein = gi $filein

- она была нужна из расчета на то, чтобы в функцию можно было вместо объекта передавать строку с путем... но в варианте с командлетом Get-ChildItem (dir), она не критична и не нужна...

- в общем,
Любой язык - [решено] Удалить первый байт в файле
я уже исправил
Аватара пользователя
m0nkrus

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение m0nkrus »

YuS_2, честно говоря, я слегка в шоке! По скорости обработки этот скрипт по сравнению с прошлым, это как небо и земля. Спасибо огромное!



P.S. А можно на всякий случай еще скрипт со строчкой "$filein = gi $filein"? Когда-нибудь перейду на десятку, а там уже версия PowerShell будет актуальной.
Аватара пользователя
YuS_2

Re: Любой язык - [решено] Удалить первый байт в файле

Сообщение YuS_2 »

Цитата m0nkrus:



Когда-нибудь перейду на десятку, а там уже версия PowerShell будет актуальной.
Любой язык - [решено] Удалить первый байт в файле




Дык, pwsh v7.2 можно установить и на семерку (он вполне портабелен)... и они будут параллельно работать, не мешая друг другу...




Цитата m0nkrus:



на всякий случай еще скрипт со строчкой "$filein = gi $filein"?
Любой язык - [решено] Удалить первый байт в файле




Эта строка была, вот перед этой:



Код:

Код: Выделить всё

$reader = [io.streamreader]::new($filein.fullname)

Там можно условие добавить с проверкой версии powershell и не удалять её

Но, по сути, эта строка работала бы в случае вот такого вызова функции



Код:

Код: Выделить всё

rw-stream "d:\folder\file.ext"

то бишь, без неё вполне можно обойтись, просто в параметр вызова не давать строку, а сразу объект, например так:



Код:

Код: Выделить всё

$obj = gi "d:\folder\file.ext"
rw-stream $obj

и всё будет функционировать без этой строки...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»