Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Копирование части текста

Новый участник


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

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


Доброго время суток.
Помогите с написанием скрипта. Есть текстовый файл index.txt

Содержание файла index.txt
Код: Выделить весь код
</ul><br/><b>Скачать с сервера:</b><br/><ul><li><a href="http://aimp.su/storage/1ebc54f4e0ab861183fc4708934d8b79/aimp_4.13.1887.exe">AIMP.RU</a></li><li><a href="http://files.programki.net/aimp/1ebc54f4e0ab861183fc4708934d8b79/aimp_4.13.1887.exe">Programki.net</a></li><li><a href="https://yadi.sk/d/GezDlNUi3EDmTy">Yandex Disk</a></li><li><a href="https://drive.google.com/file/d/0B5rovoA-boWkR0NnM21lWktjU0k/view?usp=sharing">Google Drive</a></li><li><a href="http://www.programosy.pl/program,aimp.html">Programosy.pl</a></li></ul><a href="http://trusted.kaspersky.com/1EBC54F4E0AB861183FC4708934D8B79/AIM2514/info" target="_blank">
Необходимо в нем скопировать http://aimp.su/storage/1ebc54f4e0ab8..._4.13.1887.exe и вставить в файл Downloads.cmd заменив XXXX.

Содержание файла Downloads.cmd
Код: Выделить весь код
@Echo Off
"%~dp0bin\wget" -P "%~dp0Downloads" XXXX
EXIT
Эта часть 1ebc54f4e0ab861183fc4708934d8b79/aimp_4.13.1887.exe сылки возможно постоянно меняется с выходом новой версии.
После изменения файла Downloads.cmd запустить его, а после окончания работы файла Downloads.cmd вернуть его в прежнее состояние.

Отправлено: 10:41, 26-03-2017

 

Новый участник


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

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


Iska, спасибо за помощь, но не буду занимать Ваше время. С PowerShell я не справлюсь.
Скрипт твой супер, хоть ты и говоришь, что ужас-ужас-ужас. По нему возникает множество вопросов - например: $sExpandPath - откуда взялась буква s, аналогично с $oRegExp4DownloadFileName - буква o и что это за 4; ExpandPath, ExpandFileName, ExpandFullName - не могу нигде найти про них и многое другое.
Попытался написать скрипт
Код: Выделить весь код
$SiteAdress = "http://www.nyam.pe.kr/blog/entry/Imagine-Plugins"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Foreach {$_.href } | Select-String "Imagine_Plugin" | Out-File -FilePath 'plugin.txt' -Encoding ascii
даже не смог перенаправить ссылки на скачивание, только смог сохранить их в файл.

Жаль конечно что идея рубится на корню.

Извените за потраченное время.

Отправлено: 19:19, 25-04-2017 | #21



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

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


Ветеран


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

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


Цитата 41275jur:
С PowerShell я не справлюсь. »
Справитесь, если уделите достаточно времени. Печально, конечно, что по сю пору нет вменяемого руководства по языку. В крайнем случае Вы всегда можете использовать и банальный .Net — VB или C++, благо что и компиляторы под рукой, и .Net нынче практически на девяносто процентах машин наличествует «искаропки», и даже Visual Studio в Express варианте бесплатна. На пакетных же файлах Ваша задача решаема через такую пень-колоду, что лучше и не вспоминать.

Цитата 41275jur:
Скрипт твой супер, хоть ты и говоришь, что ужас-ужас-ужас. »
Там действительно трэш, угар и содомия в коде — мои познания в нём крайне невелики.

Цитата 41275jur:
$sExpandPath - откуда взялась буква s »
Я написал . Обычный приём для нетипизированных языков — указывать подтип переменной, в данном случае — что она будет содержать строковое значение (да, я знаю, что там и строка — тоже объект).

Цитата 41275jur:
аналогично с $oRegExp4DownloadFileName - буква o и что это за 4 »
Аналогично. «o» — переменная будет «объектного» типа. «4» — читать следует как акроним слова «For», т.е. это могло бы выглядеть и как «$oRegExpForDownloadFileName». Также зачастую используют и «2» как акроним слова «To», например, «Go2Out» и т.п. Никакого сакрального смысла в них не вкладывается.

Цитата 41275jur:
ExpandPath, ExpandFileName, ExpandFullName - не могу нигде найти про них »
И не найдёте. Это просто имена обычных переменных.

Вот так уже малость получше будет, проверка, загрузка и распаковка самой утилиты и некоторых плагинов:
Скрытый текст
Код: Выделить весь код
# Imagine x86 — http://www.nyam.pe.kr/blog/entry/Imagine
# http://www.nyam.pe.kr/dev/imagine/download/unicode/Imagine_1.0.9_Unicode.zip
#
# Imagine Plugins x86 — http://www.nyam.pe.kr/blog/entry/Imagine-Plugins:
# http://www.nyam.pe.kr/dev/imagine/download/plugin/Imagine_Plugin_7Z_0.0.5.zip
# http://www.nyam.pe.kr/dev/imagine/download/plugin/Imagine_Plugin_Archive_0.0.6.zip
# http://www.nyam.pe.kr/dev/imagine/download/plugin/Imagine_Plugin_RAR_0.0.4.zip
# http://www.nyam.pe.kr/dev/imagine/download/plugin/Imagine_Plugin_WebP_0.0.8.zip
# & etc.

$aDownloadList = `
    (
        'Imagine - Image & Animation Viewer for Windows',
        'http://www.nyam.pe.kr/blog/entry/Imagine',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/unicode/(Imagine_[\d\.]+_Unicode\.zip)$',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/unicode/Imagine_([\d\.]+)_Unicode\.zip$',
        '.\Imagine',
        'Imagine.exe'
    ), (
        '7-zip File Format Plugin',
        'http://www.nyam.pe.kr/blog/entry/Imagine-Plugins',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/(Imagine_Plugin_7Z_[\d\.]+\.zip)$',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/Imagine_Plugin_7Z_([\d\.]+)\.zip$',
        '.\Imagine\Plugin',
        '7Z.plg'
    ), (
        'Numerous Archive File Formats Plugin',
        'http://www.nyam.pe.kr/blog/entry/Imagine-Plugins',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/(Imagine_Plugin_Archive_[\d\.]+\.zip)$',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/Imagine_Plugin_Archive_([\d\.]+)\.zip$',
        '.\Imagine\Plugin',
        'Archive\Archive.plg'
    ), (
        'RAR File Format Plugin',
        'http://www.nyam.pe.kr/blog/entry/Imagine-Plugins',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/(Imagine_Plugin_RAR_[\d\.]+\.zip)$',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/Imagine_Plugin_RAR_([\d\.]+)\.zip$',
        '.\Imagine\Plugin',
        'RAR.plg'
    ), (
        'WebP File Format Plugin',
        'http://www.nyam.pe.kr/blog/entry/Imagine-Plugins',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/(Imagine_Plugin_WebP_[\d\.]+\.zip)$',
        '^http://www\.nyam\.pe\.kr/dev/imagine/download/plugin/Imagine_Plugin_WebP_([\d\.]+)\.zip$',
        '.\Imagine\Plugin',
        'WebP\WebP.plg'
    ) | ForEach-Object -Process {
        [PSCustomObject]@{
            Name                    = $_[0];
            Uri                     = $_[1];
            RegExp4DownloadFileName = $_[2];
            RegExp4ProductVersion   = $_[3];
            ExpandPath              = $_[4];
            ExpandFileName          = $_[5]
        }
    }

foreach($oDownloadEntry in $aDownloadList) {
    $oUri                     = New-Object -TypeName 'System.Uri'                           -ArgumentList $oDownloadEntry.Uri
    $oRegExp4DownloadFileName = New-Object -TypeName 'System.Text.RegularExpressions.Regex' -ArgumentList $oDownloadEntry.RegExp4DownloadFileName, $([System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
    $oRegExp4ProductVersion   = New-Object -TypeName 'System.Text.RegularExpressions.Regex' -ArgumentList $oDownloadEntry.RegExp4ProductVersion,   $([System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
    $sExpandPath              = $oDownloadEntry.ExpandPath
    $sExpandFileName          = $oDownloadEntry.ExpandFileName
    $sExpandFullName          = "$sExpandPath\$sExpandFileName"

    Write-Host "`r`nUpdate checking [$($oDownloadEntry.Name)]…"

    try {
        $oHtmlWebResponseObject = Invoke-WebRequest -Uri $oUri -UseBasicParsing -ErrorAction Stop
    } catch {
        $oHttpStatusCode = $_.Exception.Response.StatusCode
        Write-Host "Can't load [$($oUri.AbsoluteUri)] ($($oHttpStatusCode.value__): $oHttpStatusCode)"
        continue
    }

    $oHtmlWebResponseObject.Links | ForEach-Object -Process {
        $sHRef = $_.href

        if($oRegExp4DownloadFileName.IsMatch($sHRef)) {
            $sDownloadFileName       = $oRegExp4DownloadFileName.Matches($sHRef).Item(0).Groups.Item(1).Value
            $sDownloadProductVersion = $oRegExp4ProductVersion.Matches($sHRef).Item(0).Groups.Item(1).Value
        
            Write-Host "Remote product version is [$sDownloadProductVersion]."

            if(Test-Path -Path $sExpandFullName -PathType Leaf) {
                $sExpandProductVersion = (Get-Item -Path $sExpandFullName).VersionInfo.ProductVersion
                Write-Host "Local product version is [$sExpandProductVersion]."
            } else {
                $sExpandProductVersion = "0.0.0.0"
                Write-Host "Local product not found."
            }

            if($sDownloadProductVersion -ne $sExpandProductVersion) {
                Write-Host "Try downloading…"
                (New-Object -TypeName 'System.Net.WebClient').DownloadFile($sHRef, $sDownloadFileName)
            
                if(Test-Path -Path $sDownloadFileName -PathType Leaf) {
                    Write-Host "Unzip downloaded file [$sDownloadFileName] into [$sExpandPath]…"
                    Expand-Archive -Path $sDownloadFileName -DestinationPath $sExpandPath -Force | Out-Null
                    Write-Host "Ready."
                } else {
                    Write-Host "Not found downloaded file [$sDownloadFileName]."
                }
            } else {
                Write-Host "Current version [$sExpandProductVersion] is up to date."
            }
        }
    }
}

Write-Host "`r`nThat's done."

При желании ещё можно удалять загруженные архивы, дабы не путались под ногами.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:10, 27-04-2017 | #22


Новый участник


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

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


Iska, подскажи более понятную литературу по PowerShell, особенно по сокращениям.

Подскажите - PowerShell воспринимает переменные среды Windows?

Возможно скачать файлы из текстового файла, например test.txt содержащий прямые ссылки?

Отправлено: 14:44, 05-05-2017 | #23


Ветеран


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

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


Цитата 41275jur:
Iska, подскажи более понятную литературу по PowerShell, »
Я же писал — её фактически нет. У нас вроде как был Попов (Книга "Введение в Windows PowerShell" Андрей Попов), а больше и не знаю. Забугорных, понятно, куда как больше. Но проблема в том, что нет именно классической документации во вменяемом формате.

Цитата 41275jur:
особенно по сокращениям. »
В оболочке набираете «help сокращение», например, «help gci» или «help %», и читаете.

Цитата 41275jur:
Подскажите - PowerShell воспринимает переменные среды Windows? »
Напрямую — нет. Через устройство $Env можно работать, например:
Код: Выделить весь код
Write-Host $Env:APPDATA
или через классы .Net.

Цитата 41275jur:
Возможно скачать файлы из текстового файла, например test.txt содержащий прямые ссылки? »
Возможно. Получаете содержимое файла по Get-Content, передаёте по конвейеру на разбор по ForEach-Object, внутри которого посредством метода .DownloadFile() объекта класса System.Net.WebClient загружаете очередной файл.

Отправлено: 15:14, 05-05-2017 | #24


Новый участник


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

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


Iska, помоги пожалуйста.

Цитата Iska:
Возможно. Получаете содержимое файла по Get-Content, передаёте по конвейеру на разбор по ForEach-Object, внутри которого посредством метода .DownloadFile() объекта класса System.Net.WebClient загружаете очередной файл. »
Код: Выделить весь код
Get-Content -Path '.\index.txt' | ForEach-Object -Process {
	$WebClient = New-Object System.Net.WebClient
	$WebClient.DownloadFile()
}
Но выскакивает ошибка:
Не удается найти перегрузку для "DownloadFile" и количества аргументов: "0".

Не могу понять, что такое перегрузку для "DownloadFile" и что писать с скобках $WebClient.DownloadFile()

Отправлено: 13:00, 07-05-2017 | #25


Ветеран


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

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


Цитата 41275jur:
Не могу понять, что такое перегрузку для "DownloadFile" и что писать с скобках $WebClient.DownloadFile() »
System.Net.WebClient - Поиск в GoogleWebClient Class (System.Net)WebClient.DownloadFile Method (String, String) (System.Net):
Цитата:
Parameters

address
Type: System.String

The URI from which to download data.

fileName
Type: System.String

The name of the local file that is to receive the data.
Первым аргументом пишете Url, вторым — имя локального файла, в который будет идти сохранение загруженного содержимого. Если все Url'ы из файла-списка напрямую содержат имя файла в последнем элементе, можно извлекать его оттуда:
Скрытый текст
Код: Выделить весь код
$sSourseFileList = 'C:\Мои проекты\0070\Urls.txt'

if(Test-Path -Path $sSourseFileList -PathType Leaf) {
    $aContent = Get-Content -Path $sSourseFileList
    
    foreach($sUrl in $aContent) {
        $sLocalFileName = [System.IO.Path]::GetFileName($sUrl)

        Write-Host "Try downloading [" -NoNewline -ForegroundColor DarkGreen
        Write-Host $sUrl               -NoNewline -ForegroundColor Cyan
        Write-Host "]…`t"              -NoNewline -ForegroundColor DarkGreen

        try {
            (New-Object -TypeName 'System.Net.WebClient').DownloadFile($sUrl, $sLocalFileName)
        } catch [System.Net.WebException] {
            Write-Host "Failure" -ForegroundColor Red

            $oHttpStatusCode = $_.Exception.Response.StatusCode

            Write-Host "Can't load ["           -NoNewline -ForegroundColor Red
            Write-Host $sUrl                    -NoNewline -ForegroundColor Cyan
            Write-Host "] ("                    -NoNewline -ForegroundColor Red
            Write-Host $oHttpStatusCode.value__ -NoNewline -ForegroundColor Yellow
            Write-Host ": "                     -NoNewline -ForegroundColor Red
            Write-Host $oHttpStatusCode         -NoNewline -ForegroundColor Yellow
            Write-Host ")"                                 -ForegroundColor Red

            continue
        }
        
        if(Test-Path -Path $sLocalFileName -PathType Leaf) {
            Write-Host "OK" -ForegroundColor Green
        } else {
            Write-Host "Can't download remote file [" -NoNewline -ForegroundColor Red
            Write-Host $sUrl                          -NoNewline -ForegroundColor Cyan
            Write-Host "] into ["                     -NoNewline -ForegroundColor Red
            Write-Host $sLocalFileName                -NoNewline -ForegroundColor Cyan
            Write-Host "]."                                      -ForegroundColor Red
        }
    }
} else {
    Write-Host "Can't find source file " -NoNewline -ForegroundColor Red
    Write-Host $sSourseFileList                     -ForegroundColor Cyan
}

Например:
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:44, 07-05-2017 | #26


Новый участник


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

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


Iska, извини меня, я наверное тебе уже надоел, но я чем дальше в PowerShell, тем больше убеждаюсь что я далекий в нем.

Нужна твоя помощь.

1. парсинг сайта
Код: Выделить весь код
$SiteAdress = "http://forum.oszone.net/thread-138555.html" 
$sSourt = 'FullFlash64'
$site = Invoke-WebRequest -UseBasicParsing -Uri $SiteAdress
$site.Links | Foreach {$_.href } | 
Select-String $sSourt | 
Select-Object -ExpandProperty line
Получаю ссылку
Код: Выделить весь код
http://files.simplix.ks.ua/1-FullFlash64.rar
как эту ссылку скачать.

2. парсинг сайта
Код: Выделить весь код
$SiteAdress = "http://forum.oszone.net/thread-145766.html"
$sSourt = 'VCR_Hyb_x86_x64'
$site = Invoke-WebRequest -UseBasicParsing -Uri $SiteAdress
$site.Links | Foreach {$_.href } | 
Select-String $sSourt | 
Select-Object -ExpandProperty line
Получаю ссылку
Код: Выделить весь код
https://www.upload.ee/files/6918564/VCR_Hyb_x86_x64_18.04.2017.rar.html
как для полученной ссылки сделать повторный парсинг. И после получения второй ссылки - скачать ее.

Возможно ли при помощи PowerShell распаковать .7z файл.

Как распаковать файл - например
Цитата Iska:
распаковка самой утилиты и некоторых плагинов: »
распаковывались только файлы без папки (Imagine_Plugin_Archive_0.0.6.zip).

Отправлено: 14:44, 19-05-2017 | #27


Ветеран


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

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


Цитата 41275jur:
1. парсинг сайта »
Никаких Select-String $sSourt | Select-Object -ExpandProperty line. Либо внутри ForEach-Object отбирайте потребные ссылки по заданным критериям, либо делайте Where-Object для того же самого.

Но вот у меня вопрос — а как Вы тут без предварительной загрузки и распаковки узнаете версию, то есть — нужно ли вообще что-то загружать? Потому тут надо обязательно учесть это:
Цитата simplix:
Производит установку Adobe Flash (последняя версия, Flash.txt) компонентов ActiveX и Plugin (NPAPI+PPAPI), »
перед любыми попытками парсинга.

Цитата 41275jur:
как эту ссылку скачать. »
В примерах выше это делается посредством New-Object -TypeName 'System.Net.WebClient').DownloadFile().
Код: Выделить весь код
…
        try {
            (New-Object -TypeName 'System.Net.WebClient').DownloadFile($sUrl, $sLocalFileName)
        } catch [System.Net.WebException] {
…
Цитата 41275jur:
Получаю ссылку
Код: Выделить весь код
https://www.upload.ee/files/6918564/VCR_Hyb_x86_x64_18.04.2017.rar.html
как для полученной ссылки сделать повторный парсинг. И после получения второй ссылки - скачать ее. »
Полагаю, можно — капчи нет. Вот как выглядит ссылка:
Код: Выделить весь код
<a id="d_l" href="https://www.upload.ee/download/6918564/dae7a1f2c31611a578b8/VCR_Hyb_x86_x64_18.04.2017.rar" onmouseover="document.dllink.src='images/dl_hover_.png';" onmouseout="document.dllink.src='images/dl_.png';"><img src="images/dl_.png" width="154" height="32" border="0" name="dllink" alt="Lae fail alla!" /></a>
Как сделать — точно так же, как делается получение первой ссылки. Надо искать ссылку с id=d_l и href, начинающемся на https://www.upload.ee/download/ и заканчивающемся на /VCR_Hyb_x86_x64_18.04.2017.rar (если Вы точно знаете имя файла) или на /VCR_Hyb_x86_x64_Дата.rar (если не знаете), проще всего это сделать регулярным выражением.

Цитата 41275jur:
Возможно ли при помощи PowerShell распаковать .7z файл. »
Без наличия 7-Zip в виде исполняемого файла или библиотеки — нет, нельзя.

Цитата 41275jur:
Как распаковать файл - например
Цитата Iska:
распаковка самой утилиты и некоторых плагинов: »
распаковывались только файлы без папки (Imagine_Plugin_Archive_0.0.6.zip). »
У меня — в папку .\Imagine\Plugin\Archive.

Отправлено: 15:11, 19-05-2017 | #28


Новый участник


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

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


Цитата Iska:
У меня — в папку .\Imagine\Plugin\Archive. »
Архив распаковывается в папку .\Imagine\Plugin\Archive\файлы, а должен распаковываться .\Imagine\Plugin\файлы.
Цитата Iska:
Без наличия 7-Zip в виде исполняемого файла или библиотеки — нет, нельзя. »
Как тогда в PowerShell выбрать разрядность - например как CMD/BAT:
Код: Выделить весь код
Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
"%~dp0\extra\%xOS%\7za" x "%~dp0\Downloads\*.7z" -oDownloads\1

Отправлено: 16:25, 19-05-2017 | #29


Ветеран


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

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


Цитата 41275jur:
а должен распаковываться .\Imagine\Plugin\файлы. »
Почему в эту, а не в .\Imagine\Plugin\Archive? Внутри архива Imagine_Plugin_Archive_0.0.6.zip находится каталог Archive, и уже в нём находятся файлы Archive.plg, Ark32.dll, ArkLicense.txt (для x86 версии). Мы извлекаем содержимое архива «как есть», посему и возникают в Plugin такие каталоги, как Archive и WebP. В чём проблема-то? Я лично не вижу таковой:


Цитата 41275jur:
Как тогда в PowerShell выбрать разрядность - например как CMD/BAT: »
Выбрать разрядность чего? И зачем нужно выбирать?

Отправлено: 00:59, 20-05-2017 | #30



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Копирование текста колонками niko_dovgiy Скриптовые языки администрирования Windows 2 07-12-2015 15:29
Интерфейс - Копирование текста в любых окнах Ardenen Microsoft Windows 7 3 23-07-2015 09:09
CMD/BAT - [решено] Замена части текста в txt файлах Traveller124 Скриптовые языки администрирования Windows 7 02-04-2012 19:16
C/C++ - Извлечение из текста нужной части Alexey271 Программирование и базы данных 9 25-11-2010 13:19
копирование текста volin Хочу все знать 10 08-01-2007 00:18




 
Переход