Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - открыть файл-архив, используя 7-ZIP, изменить текст и закрыть файл,сохранив изменения

Ответить
Настройки темы
Любой язык - открыть файл-архив, используя 7-ZIP, изменить текст и закрыть файл,сохранив изменения

Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Изменения
Автор: v79italya
Дата: 02-09-2019
Приветствую. как можно JS-скриптом или Batом открыть файл-архив, используя 7-ZIP, изменить текст и закрыть файл,сохранив изменения?
на скринах показаны шаги. архив открывается двумя шагами. сначала ПКМ -> 7-Zip -> Открыть архив. затем ПКМ -> Просмотр. нажав Просмотр, жду около минуты(это, наверное, надо учесть, поставив как то паузу) открытие файла. когда файл откроется, нажимаю Правка -> Найти.. ищу </xyzID> . все вместе <xyzID>3</xyzID> . только вместо тройки может быть любое число одно-трехзначное. и вот вместо 3(или другого числа) надо поставить 27. причем, когда набираю 27, то опять нужно около минуты ждать(опять надо учесть). потом закрываю файл с сохранением изменений и обновлением файла в архиве. возможно ли это все делать на автомате?
адрес файла и имя файла, наверное, лучше в скрипте указать. сейчас так: C:\red\xyz.iwprj2
сейчас в файле текст укорочен. поэтому будет быстро сохраняться изменения. на самом деле надо около минуты-полторы.

Отправлено: 19:08, 17-08-2019

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


v79italya, пробуйте (на PowerShell):
Скрытый текст
Код: Выделить весь код
$sArchiveFile    = 'C:\Мои проекты\0272\project.iwprj2'
$sSourceFileName = 'project'
$sPath27Za       = "$($env:ProgramFiles)\7-Zip\7za.exe"

if([System.IO.File]::Exists($sArchiveFile)) {
    if([System.IO.File]::Exists($sPath27Za)) {
        $oProcess = New-Object -TypeName 'System.Diagnostics.Process'

        $oProcess.StartInfo.FileName               = $sPath27Za
        $oProcess.StartInfo.Arguments              = "e -y -sccWIN -o""$($env:TEMP)"" ""$sArchiveFile"" ""$sSourceFileName"""
        $oProcess.StartInfo.CreateNoWindow         = $true
        $oProcess.StartInfo.UseShellExecute        = $false
        $oProcess.StartInfo.RedirectStandardOutput = $true

        if($oProcess.Start()) {
            Write-Host "Trying extract source file [$sSourceFileName] from archive [$sArchiveFile] into temp folder [$($env:TEMP)]." -ForegroundColor Green
            $oProcess.WaitForExit()
            Write-Host $($oProcess.StandardOutput.ReadToEnd()) -ForegroundColor Cyan

            if($oProcess.ExitCode -eq 0) {
                $sTempFile = "$($env:TEMP)\$sSourceFileName"
                Write-Host "Trying find and replace value in extracted file [$sTempFile]." -ForegroundColor Green

                try {
                    $oXmlDocument = [System.Xml.XmlDocument](Get-Content -Path $sTempFile)
                    $oXmlDocument.StateOfInfoProject.CaptchaID = '27'
                    $oXmlDocument.Save($sTempFile)
                } catch {
                    Write-Host "Can't find and replace value in extracted file [$sTempFile]." -ForegroundColor Red
                }

                $oProcess.StartInfo.Arguments = "u -y -sccWIN ""$sArchiveFile"" ""$sTempFile"""

                if($oProcess.Start()) {
                    Write-Host "Trying update source file [$sSourceFileName] in archive [$sArchiveFile] from previously extracted file [$sTempFile]." -ForegroundColor Green
                    $oProcess.WaitForExit()
                    Write-Host $($oProcess.StandardOutput.ReadToEnd()) -ForegroundColor Cyan

                    if($oProcess.ExitCode -eq 0) {
                        Write-Host "Delete temporary file [$sTempFile]." -ForegroundColor Green
                        [System.IO.File]::Delete($sTempFile)
                    } else {
                        Write-Host "Can't update file [$sSourceFileName] in archive [$sArchiveFile] from file [$sTempFile] correctly. 7za.exe return non-zero exit code: $($oProcess.ExitCode)." -ForegroundColor Red
                    }
                } else {
                    Write-Host "Can't execute [$($oProcess.StartInfo.FileName)] with arguments [$($oProcess.StartInfo.Arguments)] normally." -ForegroundColor Red
                }
            } else {
                Write-Host "Can't extract source file [$sSourceFileName] from archive [$sArchiveFile] correctly. 7za.exe return non-zero exit code: $($oProcess.ExitCode)." -ForegroundColor Red
            }
        } else {
            Write-Host "Can't execute [$($oProcess.StartInfo.FileName)] with arguments [$($oProcess.StartInfo.Arguments)] normally." -ForegroundColor Red
        }
    } else {
        Write-Host "Can't find executable file [$sPath27Za]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find archive file [$sArchiveFile]." -ForegroundColor Red
}

Цитата Busla:
алгоритм разработан так что получает поток и отдаёт поток - последовательность данных в один проход
для них возможно выдавать в stdout
Цитата:
If the -so switch is used with the command that creates archive, it works only with some archive formats: xz, gzip, bzip2 and tar.
»
Busla, спасибо, ясно. Ну, в данном случае как раз таки gzip.

Цитата Busla:
"обработать ситуацию" - это если не нашёлся 7zip, поискать WinRar »
Не могу с Вами согласиться, коллега.

Цитата Busla:
а ваша обработка в стиле вместо ошибки (с ошибочным кодом возврата) написать красный текст с нормальным кодом завершения - это медвежья услуга »
Это правильно, но меня дико бесит отлаживать такие ситуации в ISE — понимаете, почему. А писать красным текстом я перестану не раньше, чем этим перестанет заниматься Microsoft.

Цитата greg zakharov:
Нормально. А должно быть иначе? »
Раз у Вас нормально, значит, проблемы на моей стороне.

Цитата Sham:
С sed'ом работает и bom-метку сохраняет, но через временный файл только »
А у меня и напрямую код коллеги greg zakharov отработал. Про метку BOM — что б ему не сохранять? Вот с UTF-16LE/1200 с BOM — там интереснее должно получиться. Я особо не ковырял.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:41, 19-08-2019 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Iska, Ваш код работает! работает просто сказка! еще работает пол-секунды. и не поймешь - запустился или не запустился скрипт. проверяю файл - есть изменения. все супер. Спасибо Вам большое!
Sham, Ваш код не знаю как запустить. какой программой? я про Power Shell пол-часа гуглил перед запуском. так то, вопрос решен.

Отправлено: 06:26, 20-08-2019 | #22


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата v79italya:
и не поймешь - запустился или не запустился скрипт. »
Ну, давайте чуть поменяем:
Скрытый текст
Код: Выделить весь код
$sArchiveFile    = 'C:\Мои проекты\0272\project.iwprj2'
$sSourceFileName = 'project'
$sPath27Za       = "$($env:ProgramFiles)\7-Zip\7za.exe"

if([System.IO.File]::Exists($sArchiveFile)) {
    if([System.IO.File]::Exists($sPath27Za)) {
        $oProcess = New-Object -TypeName 'System.Diagnostics.Process'

        $oProcess.StartInfo.FileName               = $sPath27Za
        $oProcess.StartInfo.Arguments              = "e -y -sccDOS -o""$($env:TEMP)"" ""$sArchiveFile"" ""$sSourceFileName"""
        $oProcess.StartInfo.CreateNoWindow         = $true
        $oProcess.StartInfo.UseShellExecute        = $false
        $oProcess.StartInfo.RedirectStandardOutput = $true

        if($oProcess.Start()) {
            Write-Host "Trying extract source file [$sSourceFileName] from archive [$sArchiveFile] into temp folder [$($env:TEMP)]." -ForegroundColor Green
            $oProcess.WaitForExit()
            Write-Host $($oProcess.StandardOutput.ReadToEnd()) -ForegroundColor Cyan

            if($oProcess.ExitCode -eq 0) {
                $sTempFile = "$($env:TEMP)\$sSourceFileName"
                Write-Host "Trying find and replace value in extracted file [$sTempFile]." -ForegroundColor Green

                try {
                    $oXmlDocument = [System.Xml.XmlDocument](Get-Content -Path $sTempFile)
                    $oXmlDocument.StateOfInfoProject.CaptchaID = '27'
                    $oXmlDocument.Save($sTempFile)
                } catch {
                    Write-Host "Can't find and replace value in extracted file [$sTempFile]." -ForegroundColor Red
                }

                $oProcess.StartInfo.Arguments = "u -y -sccDOS ""$sArchiveFile"" ""$sTempFile"""

                if($oProcess.Start()) {
                    Write-Host "Trying update source file [$sSourceFileName] in archive [$sArchiveFile] from previously extracted file [$sTempFile]." -ForegroundColor Green
                    $oProcess.WaitForExit()
                    Write-Host $($oProcess.StandardOutput.ReadToEnd()) -ForegroundColor Cyan

                    if($oProcess.ExitCode -eq 0) {
                        Write-Host "Delete temporary file [$sTempFile]." -ForegroundColor Green
                        [System.IO.File]::Delete($sTempFile)
                    } else {
                        Write-Host "Can't update file [$sSourceFileName] in archive [$sArchiveFile] from file [$sTempFile] correctly. 7za.exe return non-zero exit code: $($oProcess.ExitCode)." -ForegroundColor Red
                    }
                } else {
                    Write-Host "Can't execute [$($oProcess.StartInfo.FileName)] with arguments [$($oProcess.StartInfo.Arguments)] normally." -ForegroundColor Red
                }
            } else {
                Write-Host "Can't extract source file [$sSourceFileName] from archive [$sArchiveFile] correctly. 7za.exe return non-zero exit code: $($oProcess.ExitCode)." -ForegroundColor Red
            }
        } else {
            Write-Host "Can't execute [$($oProcess.StartInfo.FileName)] with arguments [$($oProcess.StartInfo.Arguments)] normally." -ForegroundColor Red
        }
    } else {
        Write-Host "Can't find executable file [$sPath27Za]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find archive file [$sArchiveFile]." -ForegroundColor Red
}

Write-Host 'Press any key to continue...'
[void][System.Console]::ReadKey($true)

Отправлено: 09:52, 20-08-2019 | #23


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Iska:
не поймешь - запустился или не запустился скрипт »
так это по началу так. когда открывал Power Shell и вставлял код в программу и запускал.
а потом я сохранил в файл.ps1 и все. запускаю ПКМ Выполнить с помощью PowerShell, появляется окно cmd и как закроется, значить, скрипт сработал.
Iska, ничего менять не буду. все отлично. спасибо Вам

Отправлено: 16:27, 20-08-2019 | #24


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата v79italya:
появляется окно cmd »
Неа. Не «окно cmd». Появляется окно консоли PowerShell.

Цитата v79italya:
Iska, ничего менять не буду. все отлично. »
Если что-то пойдёт не так — поменяйте, хоть прочитать можно будет, что именно идёт не так.

Отправлено: 16:39, 20-08-2019 | #25


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Iska:
пойдёт не так — поменяйте »
ok

Отправлено: 19:20, 20-08-2019 | #26



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - открыть файл-архив, используя 7-ZIP, изменить текст и закрыть файл,сохранив изменения

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Выскакивает ошибка "Вы пытаетесь открыть файл имеющий тип системный файл (.dll)" yuazakharov Microsoft Windows 10 5 06-10-2018 12:06
CMD/BAT - [решено] Упаковать файл в архив ARJ с таким же именем как и файл Felix-rus53 Скриптовые языки администрирования Windows 1 13-02-2018 22:46
Вопрос - PDF файл открывается как ZIP. slonikdva Защита компьютерных систем 13 29-10-2017 22:15
2013 - Как открыть файл *.mdb, не используя *.ldb? IksSafonsky Microsoft Office (Word, Excel, Outlook и т.д.) 0 15-02-2016 16:09
CMD/BAT - Найти файл используя список с именами в txt файле Spacejet Скриптовые языки администрирования Windows 0 29-07-2015 10:02




 
Переход