Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5

$Matches / PowerShell vs pwsh

14.10.2022, 22:35. Показов 2467. Ответов 29

Студворк — интернет-сервис помощи студентам
В PowerShell работает, а в pwsh нет…
The variable '$Matches' cannot be retrieved because it has not been set.

А надо бы и там и там, малой кровью, общий вариант, как?
Ну или чего не работает то?
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
. {
    $ErrorActionPreference = 'Stop'
 
    function GetWebHeaders ([uri] $Uri) {
        $ProgressPreference = 'SilentlyContinue'
 
        $Head = Invoke-WebRequest -Uri $Uri -Method Head -UseBasicParsing
 
        if ($Head.StatusCode -ne 200) { throw $Head.StatusDescription }
 
        [PSCustomObject] @{
            PSTypeName = "Headers"
            Uri        = $Uri
            Headers    = $Head.Headers
        }
    }
 
    function GetWebFileName ([PSTypeName('Headers')] $Headers) {
        if ($Headers.Headers['Content-Disposition'] -match "filename=(.*);?") {
            $Matches[1].Trim('"')
        } else {
            $Headers.Uri.Segments[-1]
        }
    }
 
    $Uri = 'https://github.com/zyedidia/micro/releases/download/v2.0.11/micro-2.0.11-win64.zip'
    $Headers = GetWebHeaders -Uri $Uri
    $FileName = GetWebFileName -Headers $Headers
 
    $FileName
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.10.2022, 22:35
Ответы с готовыми решениями:

Powershell Core ( pwsh ) 6.1 Released
Вышла 13 августа на базе соответственно новейшего .NET Core 2.1 Зачем я об этом пишу, не знаю, потому что, похоже, кроме меня ...

Pwsh мобильные платформы
Собсна, сабж. Под Андроид и ИОС есть нормальные терминалы, а есть ли pwsh под эти мобильные платформы?

matches
Какой wildcard следует сделать для проверки валидности e-mail, password и name? Чтобы не проходили комбинации вроде " " и...

29
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
16.10.2022, 05:29
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
регулярочку бы адекватную подумать
по-хорошему, не совсем понял зачем вообще усложнять...
если получаем заголовки, то зачем rawcontent?
а регулярка... ну, можно так:
PowerShell
1
($Headers.headers["Content-Disposition"]|out-string) -match 'filename="([^"]+)"'
Добавлено через 7 минут
ну, а чтобы и в powershell работало, регулярку подгоним (пообломать бы руки разработчикам за такие парсеры ... дальше нецензурно)
PowerShell
1
($Headers.headers["Content-Disposition"]|out-string) -match 'filename="?([^"]+)"?'
0
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5
16.10.2022, 15:59  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
если получаем заголовки, то зачем rawcontent?
Идея получить строковый литерал с "Content-Disposition", а не распарсенный в словарь "Content-Disposition" и избежать далнейших манипуляций с преобразованием в строку.
тут rawcontent это заголовок в сыром, не распарсенном виде
т.е. из
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@"
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: x-ms-request-id,x-ms-version,x-ms-lease-status,x-ms-lease-state,x-ms-blob-type
Age: 239169
Content-Disposition: attachment; filename="VSCode-win32-x64-1.72.2.zip"
Content-MD5: mhmc76lL79sXHSKOo1Z2IQ==
X-Cache: HIT
x-ms-blob-type: BlockBlob
x-ms-lease-state: available
x-ms-lease-status: unlocked
x-ms-request-id: 92e9b36d-001e-0056-5331-dfd4f6000000
x-ms-version: 2013-08-15
Accept-Ranges: bytes
Content-Length: 120083536
Cache-Control: max-age=31536000, public
Content-Type: application/zip
Date: Sun, 16 Oct 2022 12:52:48 GMT
ETag: "0x8DAACA5EB245EC1"
Last-Modified: Wed, 12 Oct 2022 23:03:04 GMT
Server: ECAcc (ska/F7A0)
"@
получить подстроку с именем файла, ну и регулярка для этого
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
16.10.2022, 17:29
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Идея получить строковый литерал с "Content-Disposition", а не распарсенный в словарь "Content-Disposition" и избежать далнейших манипуляций с преобразованием в строку.
тут rawcontent это заголовок в сыром, не распарсенном виде
Не, я не про то...
Зачем заводить 2 функции, чтобы получить имя файла из заголовка?
1. Заголовок этот опционален и используется в качестве справочной информации... если не ошибаюсь.
Например: найди по этой ссылке заголовок с именем файла
2. Есть более простой способ:
PowerShell
1
2
[uri]$Uri = "https://geekuninstaller.com/geek.zip"
$uri.segments[-1]
Добавлено через 4 минуты
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
получить подстроку с именем файла, ну и регулярка для этого
Так, вот она, чуть выше же была:
PowerShell
1
'filename="?([^"]+)"?'
0
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5
16.10.2022, 18:30  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
Зачем заводить 2 функции, чтобы получить имя файла из заголовка?
ну… ээ… единственная ответственность?… функции для повторного использования, не обязательно совместно, от заголовка может потребоваться и дата модификации и размер…
я вот такую родил
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function Invoke-FileDownloadWebClient {
    param (
        [Parameter(Mandatory)] [uri] $DirectLink,
        [System.IO.DirectoryInfo] $DestinationDirectory
    )
 
    $ErrorActionPreference = 'Stop'
 
    if (-not $DestinationDirectory) {
        $DestinationDirectory = Get-ShellDownloadsFolder
    }
 
    if (-not (Test-Path -LiteralPath $DestinationDirectory -PathType Container)) {
        throw "Указанной папки «$DestinationDirectory» для загрузок не существует!"
    }
 
    $Headers = GetWebHeaders -Uri $DirectLink
 
    if ($Headers.Headers['Content-Type'].StartsWith("text/html")) {
        throw "Требуется прямая ссылка на файл"
    }
 
    $FileName = GetWebFileName -Headers $Headers
    $OutFile  = Join-Path -Path $DestinationDirectory -ChildPath $FileName
 
    try {
        [System.Console]::CursorVisible = $false
        Write-Host -Object $DirectLink.AbsoluteUri -BackgroundColor Black -ForegroundColor Cyan
        $msg = "{0:N2} МБ " -f ($Headers.Headers['Content-Length'] | ForEach-Object { $_ / 1MB })
        Write-Host -Object $msg -BackgroundColor Black -ForegroundColor Cyan
        DownloadFile -Uri $DirectLink -OutFile $OutFile
    } finally { [System.Console]::CursorVisible = $true }
 
    Get-Item $OutFile | Select-Object FullName, @{n='Length'; e={"{0:N2} МБ" -f ($_.Length / 1MB)}}
}

а эта тема и началась с того, что бы не нарушая обратную совместимость, заработало в pwsh.
Цитата Сообщение от YuS_2 Посмотреть сообщение
2. Есть более простой способ:
не всегда в ссылке адекватное название, если указан filename, то лучше использовать его.

Цитата Сообщение от YuS_2 Посмотреть сообщение
Например: найди по этой ссылке заголовок с именем файла
функции и призваны с этим справлятся
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
. {
    $ErrorActionPreference = 'Stop'
 
    function GetWebHeaders ([uri] $Uri) {
        $ProgressPreference = 'SilentlyContinue'
 
        $Head = Invoke-WebRequest -Uri $Uri -Method Head -UseBasicParsing
 
        if ($Head.StatusCode -ne 200) { throw $Head.StatusDescription }
 
        [PSCustomObject] @{
            PSTypeName = "Headers"
            Uri        = $Uri
            Headers    = $Head.Headers
            RawHead    = $Head.RawContent
        }
    }
 
    function GetWebFileName ([PSTypeName('Headers')] $Headers) {
        if ($Headers.RawHead -match "Content-Disposition:.*filename=(.*)") {
            $Matches[1].Trim().Trim('"')
        } else {
            $Headers.Uri.Segments[-1]
        }
    }
 
    $Uri = 'https://geekuninstaller.com/geek.zip'
    $Headers = GetWebHeaders -Uri $Uri
    
    GetWebFileName -Headers $Headers
}
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
16.10.2022, 19:31
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
функции для повторного использования, не обязательно совместно, от заголовка может потребоваться и дата модификации и размер…
это ты мне как школьнику азы преподаешь?

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
не всегда в ссылке адекватное название, если указан filename, то лучше использовать его.
Согласен, ссылки ведь зашифрованы могут быть, но тем не менее... на счет лучше - это сомнительно
ок, вот тебе filename (вернее Content-Disposition) в "прямой" ссылке:
PowerShell
1
$uri = 'https://s31vla.storage.yandex.net/rdisk/eabb18c21b900424d664403f63450195c6891d12e4fcb514057e74eff2567a4b/634c65d0/27dtdWwpiHWAOMwjvJSigCdbkJ2sC_KEk2e_VtbYAOdr6rmRYtpbQYz3IVW_GnQTUp8cZpYb05BdYA_XdsnYOQ==?uid=0&filename=%D0%93%D0%BE%D1%80%D1%8B.jpg&disposition=attachment&hash=ApNWvJ7s4%2B9/kXqvucWYohE5saH4kMa%2BI5J4CH8FGpZO9RaLvnuReUkc3F8zxpweq/J6bpmRyOJonT3VoXnDag%3D%3D&limit=0&content_type=image%2Fjpeg&owner_uid=1393670184&fsize=1762478&hid=17e80f91be8985790b9b63a1ab6d29f2&media_type=image&tknv=v2&rtoken=3glNQkEveJho&force_default=no&ycrid=na-fc8416e3a2f44fb7d0194c68d037633b-downloader3f&ts=5eb2c7c891400&96baa010c7860c9101fef0880882424c&pb=U2FsdGVkX196jOaB3leX1MyqsqJeGLHe-tT3_mIHBdwnPa24XRTjUywubbO061mua749HFXOgCsrEwY20IGlhfbwJXLGWZiretnyI-HzmFc'
attachment; filename*=UTF-8''%D0%93%D0%BE%D1%80%D1%8B.jpg
на момент проверки, ссылка уже может не работать, вот изначальная:
Это я к тому, что универсальность тут сложно получить, надо учитывать все варианты... и отсутствие заголовка, и отсутствие .segments[-1], и ссылки вот такого вида...
Вопрос только в том, как на вход функции будут попадать эти ссылки...
В общем, согласен, что бритва Оккама тут не всегда работает.
0
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5
16.10.2022, 21:01  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
это ты мне как школьнику азы преподаешь?
каков вопрос
Цитата Сообщение от YuS_2 Посмотреть сообщение
attachment; filename*=UTF-8''%D0%93%D0%BE%D1%80%D1%8B.jpg
это интересно на подумать. определить | конвертировать | нормализовать

кста $Headers.Headers['Content-Length'] тоже коллекция…
видимо pwsh так парсит


чего выбрать то?
  1. [regex] match
  2. trim
  3. join
  4. out-string
  5. foreach
  6. raw
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
16.10.2022, 21:43
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
чего выбрать то?
Ну, это тебе решать, как автору кода...
Но учитывать было бы неплохо:
1. RFC 2183, RFC 6266
2. Необязательность наличия заголовка, а также имени файла в теле ссылки.
3. Что лучше использовать задокументированные инструменты, по понятным причинам. (например, преобразование типа коллекции из одного элемента, методом .Trim(), нигде не задокументировано)
4. Регэкспы задействовать, лучше только при отсутствии других, более быстрых способов... но тут скорость некритична, поэтому как захочется, так и делать...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
видимо pwsh так парсит
руки... руки бы поотшибать создателям таких парсеров, которые меняют тип выходного элемента в зависимости от версии PS...
0
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5
17.10.2022, 22:43  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
было бы неплохо:
тады. надо ещё регулярку ловить такое: attachment; filename* = UTF-8''"%D0%93%D0%BE%D1%80%D1%8B.jpg"
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
18.10.2022, 10:09
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
надо ещё регулярку ловить такое:
Ты же понимаешь, что PS по регуляркам "впереди планеты всей"? В том смысле, что кавычки внутри кавычек для него - больная тема...
Поэтому, как-то так:
PowerShell
1
2
3
4
add-type -assemb system.web
$a = "attachment; filename* = UTF-8''`"%D0%93%D0%BE%D1%80%D1%8B.jpg`""
$null = $a -match "filename\*?\s*=\s*(?:[^'`"]*\'[^'`"]*\')?\`"?([^`"\n\r]+)\`"?"
[system.web.httputility]::urldecode($matches[1])
А, да... чтобы понимать в чем отличие, вот та же регулярка, но для нормальных парсеров регэкспов:
filename\*?\s*=\s*(?:[^'"]*\'[^'"]*\')?\"?([^"\n\r]+)\"?
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,022
01.12.2022, 00:02
Цитата Сообщение от YuS_2 Посмотреть сообщение
В том смысле, что кавычки внутри кавычек для него - больная тема...
here-string оставляет опухоль, но боль снимает

PowerShell
1
2
3
4
5
6
7
8
9
10
11
$str = @'
aaaaaaaaaa'bbbbb'ccccc
'@
 
$regex = @'
a+('b+')c+
'@
 
$str -match $regex
 
$matches.0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2022, 00:02

вывести $matches
Здравствуйте подскажите пожалуйста как сделать следующее: есть форма где юзер вводит данные <form action="" method =...

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

Метод matches
Мне нужно запретить использование цифр, пробелов и разных символов (?, &, %, и т.д.) в строке. Вот так все работает ...

RegExp.Matches
Здравствуйте. Помогите, пожалуйста, написать функцию, которая бы на входит получила код HTML (таблица). И затем из строк вида: <tr...

No route matches [POST]
Добрый день, возникает такая ошибка когда я нажимаю submit в вьюхе new. Вьюха:<h1>Создание задачи</h1> <%= form_for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru