Pull to refresh

Comments 76

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

Это как ?

Ну вот раньше в windows было 98% windows, а сейчас только 10-11

и нечего,

пользователи ОС Windows успели адаптироваться к изменениям

Это возврат к истокам. Было время, когда всего 3% с небольшим было и ничего, пользовались.

Да, и приростало потихоньку: 3.0, 3.1, 3.11...

К π стремилось...

Тоже сломался на этой строчке...

А я сломался на фразе:

Почему скриптовый язык программирования потерял актуальной для корпорации? Подробности — под катом.

WSL допилят до логического конца, коим будет превращение винды в Линукс от Майкрософта, ну а для игрушек останется режим совместимости со старым Виндоус

Просто уже есть WSL2, поэтому первый не нужен. Но многие успели сделать на нем определенные решения и не готовы резко спрыгнуть.

Превращение Винды в Линукс вряд ли возможен.
Но в Линуксе изначально поддерживались контейнеры, что оказалось офигеть как удобным в наш мир докеров и кубернетисов, а в винду это портировать нативным образом не представляется возможным из-за большой разницы в архитектуре ядра.

Вместо VBScript есть множество решений, включая тот же встроенный повершелл. Или просто ставишь питон/перл/JS/bash и понеслась. Просто у всех этих питонов, JS и так далее есть фатальный недостаток - МС ими не владеет. Поэтому основной заменой предлагаться будет powershell или JS, который слишком уж распространен, вдобавок после nodejs никто не мешает свой интерпретатор для бэкенда сделать

Все немного не так. То есть - совсем не так.

Просто уже есть WSL2, поэтому первый не нужен.

Первый - сильно легче. Потому что он - это подсистема. Примерно такая же, как Win32: Win32API ведь не является родным API Windows (современной, ведущей свое происхождение от Windows NT) , то есть интерфейс ядра имеет совсем другой набор функций (т.н. Native API). Эта концепция подсистем со своими API была заложена изначально в проект Windows NT. Но с концепция подсистем работает только в пользовательском пространстве и не совместима с приложениями, тесно связанными с ядром - вот и появился WSL2, который основан уже на виртуальной машине.

Но в Линуксе изначально поддерживались контейнеры, что оказалось офигеть как удобным в наш мир докеров и кубернетисов, а в винду это портировать нативным образом не представляется возможным из-за большой разницы в архитектуре ядра.

Виртуализация приложений в Windows существует примерно с тех же пор, что и в Linux. В частности, современная WIndows без виртуализации пространства имен работать просто не может: изначально в Windows NT не было сессий со своим виртуальным пространством имен системных объектов (они появились в AFAIK уже в WinNT 4.0 TSE, для потребностей многопользовательского терминального доступа), а в сколько нибудь современных версиях Windows (начиная с Vista) сессии не просто есть, а необходимы: сервисы ОС и программы пользователей (даже локально зарегистрированных с клавиатуры/монитора) выполняются в разных сессиях. А сессии как раз основаны на виртуализации пространства имен ОС - не только объектов файловых систем, а вообще всех именованых объектов. А в терминальных решениях от той же CItrix виртуализация приложений использовалась еще шире. Да и сейчас в версии Docker, адаптированной для Windows, есть поддержка Windows-специфических контейнеров. Другое дело, что MS решила не переносить управляющие компоненты Docker под Win32 а предпочла запускать их через WSL2, видимо, решив, что переносить не выгодно (да и не соответсвует стратегии MS по переводу своего бизнеса в облака), но технически это можно было бы сделать.

Вместо VBScript есть множество решений, включая тот же встроенный повершелл. Или просто ставишь питон/перл/JS/bash и понеслась.

Что ещё интереснее, в Windows параллельно с VBScript и примерно на тех же правах всегда существовала и версия JavaScript - по крайней мере, я не помню версию Windows Scripting Host, (WSH) в которой его не было. И вообще, WSH был штукой изначально расширяемой - например, кто-то когда-то сделал под него версию Perl - ибо WSH был основан на стандартном API COM (так же, как, к примеру, Powershell основан на стандартном API .NET CLR, под который можно и другие языки перенести - и, по крайней мере, Python, работающий с CLR, точно есть).

Да, собственно про это MS и пишет, когда упоминает JS, что он давно поддерживается.
Что касается контейнеров и так далее, мне кажется что большую роль в этом сыграл сетевой стек, который у Linux гораздо понятнее, и лучше проработан.
IMHO создать аналог кубернетеса на чистых виндовых контейнерах будет очень сложно, а докер не в последнюю очередь взлетел из-за оркестраторов типа кубера/опенщифта и попроще (докерсвармы и что там еще есть).

Да, собственно про это MS и пишет, когда упоминает JS, что он давно поддерживается.

По правде говоря, тот JS, который был в WSH вместе VBScript и современный JS, который, к примеру, в браузерах - это небо и земля. Я где-то год назад освежал свои знания по JS и этому поразился.

сетевой стек, который у Linux гораздо понятнее, и лучше проработан.

Вопрос спорный. Вообще-то сетевой стек там идет от одного и того же корня - Berkley Sockets. У Windows там ищначально было преимущество в поддержке асинхроннности (ибо в кооперативно-многозадачной Windows for WorkGroups 3.11 без этого было нельзя). Ну а в NT (и выросшейей из нее современной Windows) архитектура ввода/вывода изначально была асинхронной, а потому костыли типа epoll или WSA-функций из WfWG там изначально не требовались. Но, к примеру, Netfilter, таки да, в Linux появился на несколько лет раньше, чем его аналог в Windows - Windows Filtering Platform в Vista/Server 2K8. Насчет виртуализации сетевого стека для приложений, когда она появилась - не скажу, для пользовательских приложений она была без надобности. В современных Windows Container она есть, AFAIK - на базе связки виртуального коммутатора HyperV и WFP, я эту связку я по Server 2012 ещё помню, а когда появилась - не выяснял, может ещё и в Server2K8 R2.

Дело тут IMHO в другом: в стратегическом решении MS отказаться от развития Windows Server как универсальной платформы для приложений "на земле", без Azure, вне зависимости от его технических достоинств - потому что это не соответствовало базовой стратегии преобразования в облачную компанию (где по оценке менеджмента бабла можно поднимать больше). В результате имеем, к примеру, что в ASP.NET Core мультиплатформеннный стек на Kestrel оптимизирован куда лучше, чем базирующийся на уникальной для Windows функциональности драйвера режима ядра протокола HTTP и связанных с ним очередей (банально, к примеру, нет такого кэширования и пула контекстов обработки (это чисто внутренняя штука, не HttContext известый пользователям фреймворка), как для Kestrel - ну, а без пула и кэша в .NET плохо - GC сильно напрягается).

PS Kubernets в Windows Server в варианте работы с Windows Container таки есть, но слово Azure в названии там намекает, что это нам объедки с барского стола после облаков кинули. Насколько ему нужен WSL2 - не разбирался.

вдобавок после nodejs ...

... придётся те же зловреды лопатами разгребать.

"просто ставишь питон/перл/JS/bash" - в этом и проблема, что надо вначале поставить. А часто нужно, чтобы работало сразу.

Я имел ввиду не пользователя, а MS
У них на замену VBS уже есть рабочий powershell и JS
и смысла клепать еще один скриптовый язык - нет. Уж проще штатно встроить bash, раз уж встроили WSL

Лучше об этом не думать. Обычный человек не сможет этого понять.

Также, как и Почему скриптовый язык программирования потерял актуальной для корпорации

Microsoft находится в Редмонте (Вашингтон)

Чаще всего макросы использовались для работы в Microsoft Excel, есть они и в ворде, их применяли для автоматической генерации отчетов на основе данных, введенных в форму автоматической генерации отчетов на основе данных, введенных в форму.

Кого опять нанял селектел писать от имени переходящей учетки ? макросы -

Чтобы сэкономить время при выполнении часто повторяющихся задач, объедините несколько действий в макрос. Сначала необходимо записать макрос. Затем вы сможете запускать его нажатием кнопки на панели быстрого доступа или с помощью сочетания клавиш. Способ запуска зависит от того, как вы настроите макрос.

https://support.microsoft.com/ru-ru/office/создание-и-запуск-макроса-c6b99036-905c-49a6-818a-dfb98b7c3c9c

это только первый шаг к своим скриптам в VBA

В целом, сейчас VBScript оказался мало кому нужен в среде WIndows, поэтому компания Microsoft, стремясь сэкономить ресурсы на поддержку технологии, предпочла от нее отказаться.

Как бы так сказать, что обьявлен переход на питон в офисе

https://support.microsoft.com/en-us/office/get-started-with-python-in-excel-a33fbcbe-065b-41d3-82cf-23d05397f53d

а повершелл существует уже лет 20.

да вообще бред написан. Микрософт ничего не говорит про выпиливание VBScript из офиса, только то, что vbs перестанут выполняться в системе

да там и правда все прекрасно, в том числе вспомнила бабка

Что касается червя, то он могут распространяться и через мессенджер IRC (если тот был установлен на компьютере). Кроме того, червь загружал троянскую программу, которая отправляла создателю вируса пароли к почте и для доступа в Интернет.

VBScript в офисе? Вы о чем вообще?

Согласен, не так назвал, конечно же VBA. Автор текста тоже путает

Да, перевод отвратительный, тысяча ошибок. Какой нейросеткой переводили хоть?

Скриптом на VBS, который не хотел уходить на пенсию :)

Интересно, выкинут всю подсистему wscript?

У wscript есть оченб приятная фишка: возможность встроить интерпретатор любого из двух языков в любую программу с поддержкой COM

Почему двух языков? Любой соответствующий правилам интерпретатор поддерживается. Например, питон так встраивается в офис.

Речь о тех что из коробки в системе, т.е vbs и js

Там ничего особо нет. Реализация встраивания примитивная. Она просто на движок языка выводит и всё.

Ps: я писал свой скриптовый язык и встраивал его вплоть до поддержки отладки

Видал я ещё в детстве о том, что VBS-скрипты существуют, НО, за всё время до недавних пор я ни разу не видел, чтобы кто-то использовал эти скрипты как-то по настоящему (единственный человек, который их по настоящему использует, это один товарищ из Сургута, и чую он явно не обрадуется тому, что ему придётся учить новые языки программирования, я ему уже сразу советовал, пусть учит хотя бы Питон для начала). Я лично использовал для скриптов-самопалов суровый челябинский BAT, который сильно слабее по функционалу, но VBScript не гонял. А скрипты на VBScript видал лишь в вирусах, какие прилетали либо в письмах, либо на сайтах, которые целились на уязвимый Internet Explorer (другие браузеры чхать хотели на VBScript).

скрипты на VBScript видал лишь в вирусах, какие прилетали либо в письмах, либо на сайтах, которые целились на уязвимый Internet Explorer (другие браузеры чхать хотели на VBScript).

Active Scripting (formerly known as ActiveX Scripting) это немного не VBS

Активно используют VBA, кто с экселем \ данными работает.

VBA я хорошо знаю, использовал через M$-Access для курсача в универе и на временной подработке после универа, пилил там базу данных заказчику с кучей логики разной. Если VBA, то тогда заражённые документы для Word и Excel, а VBS это когда сами скрипты втыкались под видом каких либо плюшек, я видал и те и те. Я ещё видал письмо с VBS-скриптом внутри GZ-сжатого архива.

Я помню, что видел в коде одного зловреда `script lang="VBScript"`, но я не знал, что это называется как "ActiveX Scripting". Под именем ActiveX я лишь помню двоичные плагины к "Ослу", и либо это был Flash, либо плагины-костыли для старых камер видеонаблюдения (сейчас такие плагины совсем не нужны, благодаря WebAssembly и WebRTC, на работе разрабатываю системщину для камер видеонаблюдения и понимаю эту кухню).

Я использовал VBS в групповых политиках домена во времена WinXP. Тогда нельзя было в правилах прописать подключение сетевых дисков, делалось у меня через скрипт.

Интересненько, и, кажется я кое-что вспомнил, что в универе я откопал подобный скрипт на сетевом дискес той же ролью работы из под групповом политики в Active Directory и себе скопировал, но так и не удосужился его изучить.

Ха! А я и не знал про эту фишку, как привык в нулевых делать через скрипт, так и продолжаю :) Пойду добавлю политику.

У меня, например, скриптом создаётся задача в планировщике, которая опрашивает параметры кассы и фискального накопителя, корректирует в кассе время при необходимости, отправляет метрику в заббикс. Другой скрипт обновляет скрипты на машинах, ещё один подключал пользователю нужные ему принтера в зависимости от данных в AD

ещё один подключал пользователю нужные ему принтера в зависимости от данных в AD

А он там точно нужен? В Windows уже никак не меньше пятнадцати лет в групповые политики и их клиенты были добавлены Предпочтения(Preferences), и, к примеру, настройка принтера - это задача как раз для Предпочтений, скрипт там писать не нужно - все написано до нас. А с учетом того, что Предпочтения можно нацелить куда точнее, чем просто политики, я вообще не вижу место в этой задаче для такой сложной логики, чтобы обязательно требовался скрипт.

Представим ситуацию, что в организации сидят по кабинетам по 3-4 человека, в этих кабинетах принтеры локально подключены через USB к компьютерам, но при этом на случай выходи из строя какого-нибудь из них сохранялась возможность печатать на принтере в пределах кабинета. Причем даже если в этот кабинет пришел пользователь из другого. А локальный принтер , кстати, тоже может меняться, другую модель, к примеру поставили. Ну и да, дело было на 2003 домене)

Ну и да, дело было на 2003 домене)

Ну да, дела давно минувших дней. А, вон, в домене NT принтеры вообще негде публиковать было.

Но мы-то сейчас живем в более прогрессивные времена, не так ли?

Я просто оставлю это здесь. Ещё столько же валяется по разным папкам и используется для создания сценариев, которые понимает прога для обработки астрофотографий и выполняет записанные там команды построчно. Да, есть Питон, но запускать для него оболочку — целая эпопея, а тут в текстовом редакторе открыл, подредактировал и работает "ис-каропки".

На счёт Питона вроде как можно интегрировать в систему должным образом и будет также. На линухах по крайней мере с любым скриптовым языком достаточно просто - вписал в первой строчке путь к интерпретатору, пометить исполняемым и будет работать. Даже с PHP это работает. На Винде, чтобы сделать какой-то скрипт исполняемым, приходится в реесте прописывать всё, чтобы ось начала считать его за исполняемый файл.

А можно было постараться хотя бы без ошибок сделать. Спасибо.

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

Какие например?
Джинса какая-то.

Если тоже самое, но простыми словами, то VBScript в будущем не будет автоматически регистрироваться в Windows Scripting Host (WSH), что совершенно не запрещает зарегистрировать его там самостоятельно.

Но так как многие приложения пользуются не WSH, а собственным встроенным интерпретатором, например, VBA, то для них ничего не изменится.

Краткий пересказ, кто не читал:

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

... их применяли для автоматической генерации отчетов на основе данных, введенных в форму автоматической генерации отчетов на основе данных, введенных в форму.

Рекурсия какая-то...

Вот, кстати, на днях впервые использовал python в Экселе. Надо было посчитать количество слов в строке. Я не нашел, как это сделать штатными средствами. Зато легко получилось с помощью функции в ячейке, написанной на питоне. Две строчки и готово. Мне очень понравилось. Хоть это и не предназначено для масштабных вычислений. Расчеты идут где-то в облаке и ячейке на пересчет нужна пара секунд. К счастью, мои два десятка строк обрабатывались параллельно. Если vba будет заменен на питон, то я это, скорее, буду приветствовать.

Интересно! Подскажите, где подробнее почитать об интеграции Питона и Эксела? Это становится всё актуальнее с возможным отказом от любимого (без сарказма) MSOffice, чтобы начинать что-то переносимое между пакетами разных производителей делать.

За вами постою.

Честно говоря, тут ничего сложного нет. Тот же Гугл на первой странице выдает все, что есть. Например, это Introduction to Python in Excel от Microsoft

https://support.microsoft.com/en-au/office/introduction-to-python-in-excel-55643c2e-ff56-4168-b1ce-9428c8308545

Вот так это выглядит у меня в книге:

На компьютере Анаконда не установлена, но пришлось где-то (я не помню точно), увязать аккаунт Анаконды и MS.

Можно и формулой

=ЕСЛИ(ЕПУСТО(A1);0;ДЛСТР(СЖПРОБЕЛЫ(A1))-ДЛСТР(ПОДСТАВИТЬ(A1;" ";""))+1)

Надо было посчитать количество слов в строке. 

на VBA это делается не сильно сложной.

Option Explicit
Function WordsCount(ByVal Src As String)
Dim i As Long, count1 As Long, temp As String
count1 = 0
For i = 1 To Len(Src)
temp = Mid(Src, i, 2)
If Right(temp, 1) <> Chr(32) And Left(temp, 1) = Chr(32) Then count1 = count1 + 1
Next i
WordsCount = count1
End Function

vbscript и vba это же разные вещи?

Я бы не хотел поднимать полемику, но на мой взгляд, почти одно и то же. Синтаксис одинаковый, объектная модель та же. Я бы сказал, что VBA - это урезанная в плане объектов версия vbs. Ну, плюс хороший IDE.

Синтаксис да, но суть в том, что VBA из офиса не убирают и наверное не собираются это делать в обозримом будущем. Убирают поддержку vbscript на уровне командной строки

Питон — самое то для экселя, но странно то, что он у них в облаке исполняется... Новый ***льный зонд какой-то, хотя это не является причиной не использовать его.

Строго говоря, совершенно всё равно какой бы скрипт использовался бы внутри Windows.

А причина существования именно VBScript связана с создателем фирмы. Слышал версию, что Basic - это большая любовь основателя фирмы, Билла Гейтса, который даже бейджик носил "Программист на Бейсике". Да и самый первый значимый для фирмы Microsoft коммерчески успешный был именно Бейсиком. Затем классический Basic переродился в VisualBasic, затем в VBScript.

Но Билла Гейтса уже много лет как нет в руководстве компании.

Cамый первый значимый для фирмы Microsoft и коммерчески успешной была ошибка в договоре, которую прое**ли в IBM... Ей и только ей мастдайка обязана...

статья похожа на новость, т.к ничего полезного из неё не извлёк, всё довольно очевидно. Ожидал что будут рассмотрены альтернативные решения vb скриптам, но такого не было.

В общем-то выглядит, как фарм плюсов.

Я благодаря VBS нашел работу. Меня наняли сначала как контрактора (contact-to-hire) переводить зоопарк десктопных VBS на PowerShell. Середина 2010-х. Оказалось, что эта компания была вендором крупной нефтяной компании и этих VBS было как грязи на все случаи жизни и все окружения. Так что остался там на несколько лет уже под другие проекты. VBS, я тебя люблю!

Руками переписывали?

Текст надо высчитывать перед публикацией.

С ILoveYou рассмешили. Открою страшную тайну: а знаете сколько вирусов распространяются в формате PE EXE? Аяяяй, а давайте его выпилим? Ибо, совсем не сейфово :) Да, и макросы в офисе под нож, ибо нормальные люди идут изучать Python в скиллбокс. А эти все ваши VBA, кому они нужны xD

Как бывший специалист в сфере пекеджинга / развертывания приложений в корпоративной среде скажу свое слово.

Корпоративные системы развертывания приложений необходимы для автоматизации установки / применения кастомных настроек рабочей среды / лицензий и так далее.

То есть вот человек приходит в офис, втыкает в ноутбук флешку, вводит корпоративные креденшилы и уходит на кухню. В это время на нем устанавливается винда, все нужные для него приложения (часто специфические) с корпоративными настройками, включая даже фон рабочего стола. Системный администратор который бы это сделал за день, возможно, пропуская что-то или ошибаясь, не нужен.

В дальнейшем все апдейты приложений прилетают тоже централизовано.

У Microsoft есть система SCCM, лучшая среди унивесальных.

Так вот, множество кастомных "допилов" испокон веков делались в vbscript, и передавались от версии к версии. Конечно, теперь есть powershell, но такой апдейт сильно повлияет на переход корпоративщиков к Windows 11. Будут сидеть до последнего. Пока все не перепишут.

А скрипт для управления лицензиями slmgr.vbs они уже чем-то заменили?

Интересно, а сколько осталось существовать HTA и BAT?

не подавайте им идеи, они сами хорошо справляются.

И ежу понятно, знаете ли.

в новых актуальных версиях операционной системы Windows уже не будет поддержки фирменной операционной системы Windows.

Ну что, логично. Винда и раньше-то не очень себя поддерживала .. ;)

всë бы да, если бы они не добавляли в состав ОС кучу хлама. я более 20 позиций из win11 удалил, когда перешëл на win11. (и нет, ОС стала работать от этого только лучше).

на этом фоне они вот удаляьт vbscipt, ранее зачем-то удалили wordpad. я не то чтобы с пеной у рта готов доказывать что мне нужен тот же wordpad, но это базовая программа, редактор текста, его удалим, вставим кучу хлама. почему этот хлам не дать возможность ставить отдельно, тому кому это не хлам, а нужные элементы ОС - не понятно.

JScript я так понимаю остаётся. Есть ли в природе конвертор VBScript в JScript?

Если до сих пор нет качественного конвертора , возможно это хороший способ заработка.

Они не взаимозаменяемы. Я в своё время предпочитал JS, но некоторые вещи можно было реализовать только на VBS, например, в JS параметры передаются только по значению, насколько помню, а иногда нужно было по ссылке, есть, вроде, ещё несколько существенных различий. Так что, если и конвертировать, то в PowerShell и Python. Но там свои заморочки. Вот это раньше можно было реализовать только на VBS:

Подсчет хешей (VBS)
'работа с SAPI: forum.script-coding.com
Option Explicit

Const bufsize = 1024

Dim A, i, scrn, desired, fn, buf, bytes, tail
Dim Args, fso, HashedData, MemStr, Stream, WshShell

Set Args      = WSH.Arguments
Set fso       = CreateObject("Scripting.FileSystemObject")
Set HashedData= CreateObject("CAPICOM.HashedData")
Set MemStr    = CreateObject("SAPI.spMemoryStream")
Set Stream    = CreateObject("SAPI.spFileStream")
Set WshShell  = CreateObject("WScript.Shell")

A = Array("SHA1", "MD2", "MD4", "MD5", "SHA256", "SHA384", "SHA512")
scrn = WSH.ScriptName

With Args.Named
    For i = 0 To UBound(A)
        If .Exists(A(i)) Then
            desired=UCase(.Item(A(i)))
            Exit For
        End If
    Next
End With

If i > UBound(A) Then
    WshShell.Popup "Укажи алгоритм", 5, scrn, 48
    WSH.Quit -1
End If

If Args.Unnamed.Count <> 1 Then
    WshShell.Popup "Укажи имя файла!", 5, scrn, 48
    WSH.Quit -1
End If

fn=fso.GetAbsolutePathName(Args.Unnamed(0))
If Not fso.FileExists(fn) Then
    WshShell.Popup "Файл не найден:" & vbCrLf & """" & fn & """", 5, scrn, 48
    WSH.Quit -1
End If

If fso.GetFile(fn).Size = 0 Then
    WshShell.Popup "Файл пуст:" & vbCrLf & """" & fn & """", 5, scrn, 48
    WSH.Quit -1
End If

HashedData.Algorithm = i

With Stream
    .Open fn
    Do While True
        bytes = .Read(buf,bufsize)
        If bytes < bufsize Then
            If bytes > 0 Then
                MemStr.SetData buf
                MemStr.Read tail,bytes
                HashedData.Hash tail
            End If
            Exit Do
        End If
        HashedData.Hash buf
    Loop 
    .Close
End With

If desired <> "" Then
    If desired = HashedData.Value Then
        WshShell.Popup "Ok", 0, scrn, 64
        WSH.Quit 0
    Else
        WshShell.Popup "Файл: """ & fn & """" & vbCrLf & A(i) & ":" & HashedData.Value, 0, scrn, 48
        WSH.Quit -2
    End If
Else
    WshShell.Popup "Файл: """ & fn & """" & vbCrLf & A(i) & ":" & HashedData.Value, 0, scrn, 64
    WSH.Quit 0
End If

А лет пятнадцать назад реализовал на PowerShell:

Подсчёт хешей (PowerShell)
<#.SYNOPSIS
Выводит либо проверяет MD5, SHA1, SHA256, SHA384, SHA512 хэши указанного файла.
.DESCRIPTION
Выводит либо проверяет MD5, SHA1, SHA256, SHA384, SHA512 хэши указанного файла.
.PARAMETER Path
Задает путь к файлу.
.PARAMETER MD5
Вычисляет и выводит MD5 хэш.
.PARAMETER SHA1
Вычисляет и выводит SHA1 хэш.
.PARAMETER SHA256
Вычисляет и выводит SHA256 хэш.
.PARAMETER SHA384
Вычисляет и выводит SHA384 хэш.
.PARAMETER SHA512
Вычисляет и выводит SHA512 хэш.
.PARAMETER Common
Вычисляет и выводит MD5 и SHA1 хэш. Если ни один параметр MD5, SHA1, SHA256, SHA384 или SHA512 не задан, считается, что задан параметр Common.
.PARAMETER All
Вычисляет и выводит MD5, SHA1, SHA256, SHA384 и SHA512 хэш.
.PARAMETER CheckMD5
Задает хэш MD5, который следует проверить на совпадение с вычисленным.
.PARAMETER CheckSHA1
Задает хэш SHA1, который следует проверить на совпадение с вычисленным.
.PARAMETER CheckSHA256
Задает хэш SHA256, который следует проверить на совпадение с вычисленным.
.PARAMETER CheckSHA384
Задает хэш SHA384, который следует проверить на совпадение с вычисленным.
.PARAMETER CheckSHA512
Задает хэш SHA512, который следует проверить на совпадение с вычисленным.
.PARAMETER Action
Задает действие, которое следует выполнить. Допустимые значения: "ComputeMD5", "ComputeSHA1", "ComputeSHA256", "ComputeSHA384", "ComputeSHA512", "MD5", "SHA1", "SHA256", "SHA384", "SHA512" - для вычисления соответствующего хэша; "CheckMD5", "CheckSHA1", "CheckSHA256", "CheckSHA384", "CheckSHA512" - для проверки хэша, заданного параметром GivenHash. Регистр символов параметра Action значения не имеет.
.PARAMETER GivenHash
Задает хэш, который следует проверить на совпадение с вычисленным.
.PARAMETER Mode
Задает режим вычисления нескольких хэшей. Допустимые значения: 0 (значение по умолчанию) - файл читается однократно, все суммы расчитываются по мере чтения файла; 1 - каждая из хэш сумм вычисляется последовательно, файл читается столько раз, сколько требуется вычислить хэшей и обрабатывается как поток, а не читается частями (применяется по умолчанию, если тербуется вычислить только одну хэш сумму); 2 - расчет выполняется параллельно в фоновых заданиях PowerShell, каждое задание вычисляет один хеш и работает в режиме 1 (режим 2 не действует, если необходимо вычислить только одну хэш сумму).
.PARAMETER ScriptArguments
Задает хэш-таблицу, которая используется для передачи дополнительной информации (общие и некоторые необязательные параметры) из основного скрипта в фоновые задания. Ключи хэш-таблицы задают имена переменных скрипта, значения которых должны быть установлены равными значениям хэш-таблицы. Не все переменные могут быть изменены таким способом.
.PARAMETER ToLower
Выводит хэш суммы строчными буквами.
.INPUTS
System.String
Строку, содержащую путь к файлу, можно передать скрипту Check-Hash по конвейеру.
.OUTPUTS
System.Collections.Hashtable
Выводит хэш-таблицу, содержащую вычисленные хэш суммы для файла или логические значения, отражающие успешность проверки заданных хэш сумм.
.NOTES
1. Быстрое прерывание вычислений по Control-Break возможно только в режиме 0. Этот режим можно задать и при вычислении одного хэша.
2. Когда проверяются несколько хэш сумм, выходная хэш-таблица будет содержать значение Status равное $true, если все хэш суммы совпали и $false в противном случае.
3. В режиме 2 из заданных обших параметров в фоновые задания передаются только параметры Verbose, WarningActon, ErrorAction, а также соответствующие им привилегированные переменные, если их значения не равны значениям по умолчанию.
#>

[CmdletBinding(DefaultParameterSetName='Compute')]
Param(	[parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
		[String][Alias("FullName")][ValidateNotNullOrEmpty()]$Path,
	[parameter(ParameterSetName='Compute')][Switch]$MD5,
	[parameter(ParameterSetName='Compute')][Switch]$SHA1,
	[parameter(ParameterSetName='Compute')][Switch]$SHA256,
	[parameter(ParameterSetName='Compute')][Switch]$SHA384,
	[parameter(ParameterSetName='Compute')][Switch]$SHA512,
	[parameter(ParameterSetName='Compute')][Switch]$Common,
	[parameter(ParameterSetName='Compute')][Switch]$All,
	[parameter(ParameterSetName='Check')][String][ValidateLength(32,32)][ValidatePattern('[0-9a-fA-F]{32}')]$CheckMD5,
	[parameter(ParameterSetName='Check')][String][ValidateLength(40,40)][ValidatePattern('[0-9a-fA-F]{40}')]$CheckSHA1,
	[parameter(ParameterSetName='Check')][String][ValidateLength(64,64)][ValidatePattern('[0-9a-fA-F]{64}')]$CheckSHA256,
	[parameter(ParameterSetName='Check')][String][ValidateLength(96,96)][ValidatePattern('[0-9a-fA-F]{96}')]$CheckSHA384,
	[parameter(ParameterSetName='Check')][String][ValidateLength(128,128)][ValidatePattern('[0-9a-fA-F]{128}')]$CheckSHA512,
	[parameter(ParameterSetName='Compute')][parameter(ParameterSetName='Check')]
		[Int][ValidateRange(0,2)][ValidateScript({$script:ModeSet = $true; $true})]$Mode=0,
	[parameter(ParameterSetName='SingleSum', Mandatory=$true, Position=1)]
		[String][ValidatePattern('^(Check|Compute)?(MD5|SHA1|SHA256|SHA384|SHA512){1}$')]$Action,
	[parameter(ParameterSetName='SingleSum', Position=2)][String]$GivenHash,
	[parameter(ParameterSetName='SingleSum')][Hashtable]$ScriptArguments,
	[Switch]$ToLower)

function OutHashTable($out){
	if($out){$HashTable = @{}
		foreach($i in $out){$HashTable += @{([Array]$i.Keys)[0]=([Array]$i.Values)[0]}}
		if(($v = [Array]$HashTable.Values)[0] -is [Boolean] -and $v.length -gt 1){
			$Status = $true
			foreach($i in $v){if(!$i){$Status = $false; break}}
			$HashTable += @{Status=$Status}
		}
	}
	$HashTable
}

function GetTypes($a){$t=@(); foreach($i in $a){$t += @($i.type)}; $t -join ', '}

$Path = Resolve-Path $Path
if(!(Test-Path $Path)){Throw "Не найден:""$Path"""}
$a = @()
switch($PsCmdlet.ParameterSetName){
	'Check'{
		if($CheckMD5){$a += @{type='MD5'; value=$CheckMD5}}
		if($CheckSHA1){$a += @{type='SHA1'; value=$CheckSHA1}}
		if($CheckSHA256){$a += @{type='SHA256'; value=$CheckSHA256}}
		if($CheckSHA384){$a += @{type='SHA384'; value=$CheckSHA384}}
		if($CheckSHA512){$a += @{type='SHA512'; value=$CheckSHA512}}
	}
	'Compute'{
		if($MD5 -or $Common -or $All){$a += @{type='MD5'}}
		if($SHA1 -or $Common -or $All){$a += @{type='SHA1'}}
		if($SHA256 -or $All){$a += @{type='SHA256'}}
		if($SHA384 -or $All){$a += @{type='SHA384'}}
		if($SHA512 -or $All){$a += @{type='SHA512'}}
	}
	'SingleSum'{
		if(($Action -notmatch 'Check' -and !$GivenHash) -or ($Action -match 'Check' -and`
		(($Action -match 'MD5' -and $GivenHash -match '[0-9a-fA-F]{32}') -or`
		($Action -match 'SHA1' -and $GivenHash -match '[0-9a-fA-F]{40}') -or`
		($Action -match 'SHA256' -and $GivenHash -match '[0-9a-fA-F]{64}') -or`
		($Action -match 'SHA384' -and $GivenHash -match '[0-9a-fA-F]{96}') -or`
		($Action -match 'SHA512' -and $GivenHash -match '[0-9a-fA-F]{128}')))){
			$h = @{type=$Action -replace 'Check|Compute', ''}
			if($GivenHash){$h += @{value=$GivenHash}}
			$a += $h
		}else{Throw "Значение параметра GivenHash задано неверно!"}
		if($ScriptArguments){
			$ScriptArguments.GetEnumerator() | Foreach-Object {
				if('a', 'Path', 'value', 'out' -notcontains $_.Key){
					if('Verbose', 'ErrorAction' -contains $_.Key){
							$Key = "$($_.Key)Preference"
							$NewValue = if($_.Value -isnot [Boolean]){$_.Value}
								else{"$(if(!$_.Value){'Silently'})Continue"}
						}
						else{	$Key = "$($_.Key)"
							if($Key -eq 'WarningAction'){$Key = 'WarningPreference'}
							$NewValue = $_.Value
						}
					Set-Variable "$Key" -Value $NewValue -Scope Script
				}
			}
		}
	}
}
if(!$a.Count){$a = @(@{type='MD5'}, @{type='SHA1'})}
$Script = $MyInvocation.MyCommand.Path
$bufsize = 16kb
$buffer = New-Object Byte[] -ArgumentList $bufsize
if($a.Count -eq 1 -and (!$ModeSet -or ($ModeSet -and $Mode -gt 0))){
	$type = $a[0].type
	if($a[0].value){$value = $a[0].value}
	Write-Verbose "Расчет $type выполняется в режиме 1"
	$file = New-Object System.IO.FileStream($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read,
		[System.IO.FileShare]::Read, $bufsize)
	$CSP = New-Object "System.Security.Cryptography.${type}CryptoServiceProvider"
	if(!$ToLower){$type = $type.ToUpper(); $x = 'X2'}else{$type = $type.ToLower(); $x = 'x2'}
	$hash = ($CSP.ComputeHash($file) | ForEach-Object {$_.ToString($x)}) -join ''
	$file.Close()
	if($value){@{$type=$hash -eq $value}}else{@{$type=$hash}}
}elseif($Mode -eq 0){
	Write-Verbose "Расчет $(GetTypes $a) выполняется в режиме 0"
	$file = New-Object System.IO.FileStream($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read,
		[System.IO.FileShare]::Read, $bufsize)
	for($i = 0; $i -lt $a.length; $i++){
		$a[$i] += @{CSP=New-Object "System.Security.Cryptography.$($a[$i].type)CryptoServiceProvider"}
	}
	while($bytes = $file.Read($buffer, 0, $bufsize)){
		for($i = 0; $i -lt $a.length; $i++){[Void]$a[$i].CSP.TransformBlock($buffer, 0, $bytes, $buffer, 0)}
	}
	for($i = 0; $i -lt $a.length; $i++){[Void]$a[$i].CSP.TransformFinalBlock($buffer, 0, 0)}
	$file.Close()
	$out = @()
	if(!$ToLower){$x = 'X2'}else{$x = 'x2'}
	for($i = 0; $i -lt $a.length; $i++){
		$hash = ($a[$i].CSP.Hash | ForEach-Object {$_.ToString($x)}) -join ''
		$type = if(!$ToLower){$a[$i].type.ToUpper()}else{$a[$i].type.ToLower()}
		$out += if($a[$i].value){@{$type=$hash -eq $a[$i].value}}else{@{$type=$hash}}
	}	
	OutHashTable $out
}elseif($Mode -eq 1){
	Write-Verbose "Расчет $(GetTypes $a) выполняется в режиме 1"
	$out = @()
	foreach($i in $a){
		$out += & "$Script" $Path "$(if($i.value){"Check"})$($i.type)" "$(if($i.value){$i.value})" -ToLower:$ToLower
	}
	OutHashTable $out
}elseif($Mode -eq 2){
	Write-Verbose "Расчет $(GetTypes $a) выполняется в режиме 2"
	$jobs = @()
	$ScriptArguments_ = ""
	$PSBoundParameters.GetEnumerator() |
		Foreach-Object {if($_.Key -notmatch 'Path|MD5|SHA1|SHA256|SHA384|SHA512|Common|All|Mode|^Action$|GivenHash|ScriptArguments'){
			$v = "$($_.Value.ToString())" -replace "'", "''"
			$ScriptArguments_ += "`n$($_.Key)=$(if($_.Value -eq $null){'$null'}else{"[$($_.Value.GetType().Name)]'$v'"})"
		}}
	if($VerbosePreference -ne 'SilentlyContinue' -and $ScriptArguments_ -notmatch '\nVerbose='){
		$ScriptArguments_ += "`nVerbosePreference=[String]'$VerbosePreference'"
	}
	if($WarningPreference -ne 'Continue' -and $ScriptArguments_ -notmatch '\nWarningAction='){
		$ScriptArguments_ += "`nWarningPreference=[String]'$WarningPreference'"
	}
	if($ErrorActionPreference -ne 'Continue' -and $ScriptArguments_ -notmatch '\nErrorAction='){
		$ScriptArguments_ += "`nErrorActionPreference=[String]'$ErrorActionPreference'"
	}
	foreach($i in $a){$jobs += Start-Job -ScriptBlock {param($p1, $p2, $p3, $p4, $p5) $p=@{};
		(ConvertFrom-StringData $p5).GetEnumerator() | Foreach-Object {
			$v = $_.Value -replace '\[SwitchParameter\]', '[Boolean]' -replace '\[ActionPreference\]', '[String]'
			if($v -match "^\[Boolean\]'([^']+)'$"){$v = '$' + $Matches[1]}
			$p += Invoke-Expression "@{$($_.Key)=$v}"
		}
		& "$p1" $p2 $p3 $p4 -ScriptArguments $p}`
		-ArgumentList $Script, $Path, "$(if($i.value){"Check"})$($i.type)", "$(if($i.value){$i.value})", $ScriptArguments_}
	if($jobs){try{$out = Wait-Job $jobs | Receive-Job}finally{Remove-Job $jobs -Force}}
	OutHashTable $out
}else{Throw "Неизвестный режим:$Mode!"}

С тех про PowerShell и Python активно развивались, а JS и VBS "застыли", по крайней мере, в реализации WSH "из коробки".

Sign up to leave a comment.