Показать полную графическую версию : Копирование части текста
41275jur
25-04-2017, 19:19
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
даже не смог перенаправить ссылки на скачивание, только смог сохранить их в файл.
Жаль конечно что идея рубится на корню.
Извените за потраченное время.
С PowerShell я не справлюсь. »
Справитесь, если уделите достаточно времени. Печально, конечно, что по сю пору нет вменяемого руководства по языку. В крайнем случае Вы всегда можете использовать и банальный .Net — VB или C++, благо что и компиляторы под рукой, и .Net нынче практически на девяносто процентах машин наличествует «искаропки», и даже Visual Studio в Express варианте бесплатна. На пакетных же файлах Ваша задача решаема через такую пень-колоду, что лучше и не вспоминать.
Скрипт твой супер, хоть ты и говоришь, что ужас-ужас-ужас. »
Там действительно трэш, угар и содомия в коде — мои познания в нём крайне невелики.
$sExpandPath - откуда взялась буква s »
Я написал :). Обычный приём для нетипизированных языков — указывать подтип переменной, в данном случае — что она будет содержать строковое значение (да, я знаю, что там и строка — тоже объект).
аналогично с $oRegExp4DownloadFileName - буква o и что это за 4 »
Аналогично. «o» — переменная будет «объектного» типа. «4» — читать следует как акроним слова «For», т.е. это могло бы выглядеть и как «$oRegExpForDownloadFileName». Также зачастую используют и «2» как акроним слова «To», например, «Go2Out» и т.п. Никакого сакрального смысла в них не вкладывается.
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."
При желании ещё можно удалять загруженные архивы, дабы не путались под ногами.
41275jur
05-05-2017, 14:44
Iska, подскажи более понятную литературу по PowerShell, особенно по сокращениям.
Подскажите - PowerShell воспринимает переменные среды Windows?
Возможно скачать файлы из текстового файла, например test.txt содержащий прямые ссылки?
Iska, подскажи более понятную литературу по PowerShell, »
Я же писал — её фактически нет. У нас вроде как был Попов (Книга "Введение в Windows PowerShell" Андрей Попов (https://www.ozon.ru/context/detail/id/4077684/)), а больше и не знаю. Забугорных, понятно, куда как больше. Но проблема в том, что нет именно классической документации во вменяемом формате.
особенно по сокращениям. »
В оболочке набираете «help сокращение», например, «help gci» или «help %», и читаете.
Подскажите - PowerShell воспринимает переменные среды Windows? »
Напрямую — нет. Через устройство $Env можно работать, например:
Write-Host $Env:APPDATA
или через классы .Net.
Возможно скачать файлы из текстового файла, например test.txt содержащий прямые ссылки? »
Возможно. Получаете содержимое файла по Get-Content, передаёте по конвейеру на разбор по ForEach-Object, внутри которого посредством метода .DownloadFile() объекта класса System.Net.WebClient загружаете очередной файл.
41275jur
07-05-2017, 13:00
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()
Не могу понять, что такое перегрузку для "DownloadFile" и что писать с скобках $WebClient.DownloadFile() »
System.Net.WebClient - Поиск в Google (https://www.google.com/search?q=System.Net.WebClient)→WebClient Class (System.Net) (https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx)→WebClient.DownloadFile Method (String, String) (System.Net) (https://msdn.microsoft.com/en-us/library/ez801hhe(v=vs.110).aspx):
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
}
http://i.imgur.com/Iepie1G.png
41275jur
19-05-2017, 14:44
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 файл.
Как распаковать файл - например
распаковка самой утилиты и некоторых плагинов: »
распаковывались только файлы без папки (Imagine_Plugin_Archive_0.0.6.zip).
1. парсинг сайта »
Никаких Select-String $sSourt | Select-Object -ExpandProperty line. Либо внутри ForEach-Object отбирайте потребные ссылки по заданным критериям, либо делайте Where-Object для того же самого.
Но вот у меня вопрос — а как Вы тут без предварительной загрузки и распаковки узнаете версию, то есть — нужно ли вообще что-то загружать? Потому тут надо обязательно учесть это:
Производит установку Adobe Flash (последняя версия, Flash.txt (http://files.simplix.ks.ua/Flash.txt)) компонентов ActiveX и Plugin (NPAPI+PPAPI), »
перед любыми попытками парсинга.
как эту ссылку скачать. »
В примерах выше это делается посредством New-Object -TypeName 'System.Net.WebClient').DownloadFile().
…
try {
(New-Object -TypeName 'System.Net.WebClient').DownloadFile($sUrl, $sLocalFileName)
} catch [System.Net.WebException] {
…
Получаю ссылку
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 (если не знаете), проще всего это сделать регулярным выражением.
Возможно ли при помощи PowerShell распаковать .7z файл. »
Без наличия 7-Zip в виде исполняемого файла или библиотеки — нет, нельзя.
Как распаковать файл - например
Цитата Iska:
распаковка самой утилиты и некоторых плагинов: »
распаковывались только файлы без папки (Imagine_Plugin_Archive_0.0.6.zip). »
У меня — в папку .\Imagine\Plugin\Archive.
41275jur
19-05-2017, 16:25
У меня — в папку .\Imagine\Plugin\Archive. »
Архив распаковывается в папку .\Imagine\Plugin\Archive\файлы, а должен распаковываться .\Imagine\Plugin\файлы.
Без наличия 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
а должен распаковываться .\Imagine\Plugin\файлы. »
Почему в эту, а не в .\Imagine\Plugin\Archive? Внутри архива Imagine_Plugin_Archive_0.0.6.zip находится каталог Archive, и уже в нём находятся файлы Archive.plg, Ark32.dll, ArkLicense.txt (для x86 версии). Мы извлекаем содержимое архива «как есть», посему и возникают в Plugin такие каталоги, как Archive и WebP. В чём проблема-то? Я лично не вижу таковой:
http://i.imgur.com/jACeFxN.png
Как тогда в PowerShell выбрать разрядность - например как CMD/BAT: »
Выбрать разрядность чего? И зачем нужно выбирать?
41275jur
23-05-2017, 14:13
Почему в эту, а не в .\Imagine\Plugin\Archive? »
Извини - моя невнимательность.
Но вот у меня вопрос — а как Вы тут без предварительной загрузки и распаковки узнаете версию »
Написал скрипт
$SiteAdress = 'http://files.simplix.ks.ua/Flash.txt'
$Uri = 'http://files.simplix.ks.ua/1-FullFlash64.rar'
$DownloadEntry = 'Adobe Flash Player ActiveX and Plugin'
$SourseFile = 'Flash.rar'
$FileName = 'Flash.exe'
Write-Host "`r`nПроверка обновлений [$($DownloadEntry)]…"
$site = Invoke-WebRequest -UseBasicParsing -Uri $SiteAdress
Write-Host "Версия программы на сайте " -NoNewline -ForegroundColor DarkGreen
Write-Host $site.Content -NoNewline -ForegroundColor Cyan
Write-Host "" -NoNewline -ForegroundColor DarkGreen
$Path = (Get-ItemProperty ‘HKLM:\SOFTWARE\Macromedia\FlashPlayerActiveX’)
$Path.PSObject.Properties | ForEach-Object {
If($_.Name -like '*Version*'){
Write-Host "`r`nУстановленая версия программы " -NoNewline -ForegroundColor DarkGreen
Write-Host $_.Value -NoNewline -ForegroundColor Cyan
Write-Host "" -NoNewline -ForegroundColor DarkGreen
Write-Host "`r`nСкачиваем файл [$($SourseFile)]…"
Invoke-WebRequest $Uri -OutFile $SourseFile -UseBasicParsing -ErrorAction Stop
if(Test-Path -Path $SourseFile -PathType Leaf) {
Write-Host "Файл " -NoNewline -ForegroundColor DarkGreen
Write-Host $SourseFile -NoNewline -ForegroundColor Cyan
Write-Host " скачен" -NoNewline -ForegroundColor DarkGreen
Write-Host " OK" -NoNewline -ForegroundColor Cyan
Write-Host "`r`nРаспаковка файла [$($FileName)]…"
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
sz e -r $SourseFile $FileName
if(Test-Path -Path $FileName -PathType Leaf) {
Write-Host "Файл " -NoNewline -ForegroundColor DarkGreen
Write-Host $FileName -NoNewline -ForegroundColor Cyan
Write-Host " распакован" -NoNewline -ForegroundColor DarkGreen
Write-Host " OK" -NoNewline -ForegroundColor Cyan
Start-Process Flash.exe -Wait
}
}
}
}
Что то я запутался в этом скрипте.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.