Сообщество - Лига Сисадминов

Лига Сисадминов

2 410 постов 18 930 подписчиков

Популярные теги в сообществе:

15

Кадры, прогнозы и итоги. Теперь для ИТ на 08-2025

Для ЛЛ: ничего нового. Взлом МТС, СДЭК, теперь Аэрофлота учит только одному: безответственность и простои не наказываются. Кадры не нужны.

Вместо предисловия

26.04.2018 Управление демографическими сдвигами станет одной из тем для дискуссий на ПМЭФ-2018. Согласно нашим расчетам, численность трудоспособного населения России, в соответствии с прогнозами, должна сократиться со 100 млн человек в 2015 году до 89 млн человек к 2030 году
Форбс: Редкие кадры: экономику России тормозит дефицит трудоспособного населения

27.04.2022 Позитивную новость представил Росстат: в России стало больше граждан трудоспособного возраста. По данным на 1 января 2022 года, их насчитывалось 83,2 млн человек. РГ

15.06.2025 По данным на первый квартал 2025 года, численность работников в российских организациях достигла 43,6 миллиона человек, сообщает TAdviser.
Институт статистических исследований и экономики знаний НИУ ВШЭ

30.07.2025 В 2025 году в России 45 тысяч 428 граждан получали заработную плату, размеры которой превышали миллион рублей.
При этом:
зарплату до двух миллионов рублей получали 34 399 человек;
от двух до трех — 5 728;
более трех — 5 301.
Стало известно количество россиян с зарплатой от миллиона рублей в месяц

Очень мне интересно, чего позитивного в новости «планировали 89 миллионов к 2030, получили 83.2 миллиона к 2022». И это на апрель 2022, еще без учета убыли трудоспособного населения в сторону, которую нельзя называть, и эмиграции активного трудоспособного населения.

Но, к теме. Найм в ИТ в РФ, июль 2025.

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

Как выяснилось из сбора мнений, HR (и наши тоже, ленивые стали – увольнять пора) вообще не ведут количественную оценку рынка. Почему? Им и не надо, и инструментов нет.
Для linkedin, myworkdayjobs и остальных картина та же.
Можно только заказать на 100% высосанный, и хорошо если из пальца, «отчет по статистике все равно кого». Понять по этому отчету, «сколько будет стоить вот такой специалист», конечно, невозможно. Нет в ИТ единой тарифной сетки.
Это не надо и нашему, и не только нашему бизнесу – найм через социальную сеть намного эффективнее, в то время как hh иногда выносит абсолютно некомпетентных людей. Я думал, что «пришел на интервью с мамой, мальчик 30 годиков» - это шутка, но нет.

Статистику портят и фейковые вакансии, с их «знать все, оплата веткой», и фейковые специалисты после кратких курсов «умею docker run».

Отдельно статистику портит и передача поиска от hh к разного рода API и краулерам. То есть функция «поставить сотрудника на мониторинг на hh» была всегда, как только ты открывал резюме, то через пару часов в кадровый отдел прилетало оповещение. Сейчас системы поиска и всех свои внутренние, с кучей пометок  (на hh тоже).
Кто там интересовался, есть ли черные списки в крупном найме – да, есть. Есть как публичные оценки во внутренних системах, так и не публичные.

Отдельная проблема, это наступившее переименование еще одного сегмента рынка.
Devops – был подход, стал системный администратор Linux.
SRE – был подход, стал .. тоже системный администратор Linux, но дороже.
Первый перевод книги от Гугля «Site Reliability Engineering: How Google Runs Production Systems» вышел в 2018, сама книга вышла 2016, всего 10 лет спустя в РФ стали переименовывать отделы и вакансии . Магия слов, все по классике – начать с двигания кроватей, закончить переименованием отдела  сисадминов в департамент SRE. И покрыть все «метриками», за которыми потом не следить.

Остается единственный метод оценки – платежеспособный спрос на реальных специалистов на рынке. Но этот спрос, конечно, нужно строго сегментировать – в каком секторе рынка, про какие деньги речь. И какие кадры ищут.

Снизу на рынок давит масса выпускников краткосрочных курсов. Они и так были не нужны, а сейчас, с массовым внедрением AI – не нужны вообще.

Сбоку рынок добивает мозаичное мнение руководства, и это очень интересная тема.

Надо понимать, что начальство (что в крупном западном бизнесе, что в российском) – не собственник, а назначенный сотрудник. Только в западном бизнесе он нанят, исходя из каких-то задач (и то, судя по Brian Krzanich из Intel, это не дает гарантий), в крупном и среднем российском – скорее, «назначен». Отсюда постоянно возникает дисбаланс, когда у начальства свои задачи и цели, и, если начальство предпочитает что-то делать в своих интересах, а не в интересах фирмы, особенно как их видит сотрудник на линейной, или не на линейной позиции – значит, вы чего-то не знаете, и вам не говорят. Возможно, вам не говорят специально.
В том числе, при вопросе «почему так в статистике» или «почему так в найме», ответ простой. Потому что в таком состоянии дел кто-то заинтересован. Или наоборот, кто-то не заинтересован в изменениях, и в наведении порядка. HR творят фигню, прибыль падает, но для начальника и HR это не имеет значения, если их премия не привязана к KPI по прибыли. Или даже если и привязана, то рост прибыли за счет сокращения расходов, в том числе на персонал, это мировая практика.
Более того, сокращение капитальных расходов и снижение отчислений на амортизацию, или прочий бардак, могут иметь под собой различные обоснования, от «не имеет значения» до «поставлена задача снизить расходы, в том числе и через снижение покупки нового оборудования».
Это все вопрос баланса – насколько можно снизить качество сервиса без последствий для руководителей?

Сколько потеряло Домодедово 26 декабря 2010?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию?

Сколько потеряла МТС от простоя с 17 марта 2024 года?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Сколько потерял СДЭК?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Сколько потерял Аэрофлот?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Если руководство ничего не потеряло, то какая разница, что там потеряли пассажиры, заказчики, "бизнес" итд?  
В новостях в РФ все эти события подаются как последствия непреодолимых внешних сил. Прорвало дамбу – не потому, что на постройке скроили, а потому что очень сильный дождь.
Пилот не смог посадить самолет на ручном управлении – не потому, что его не учили, а виноват пилот.
Злые хакеры взломали (МТС, СДЭК, Аэрофлот, и еще вопрос, сколько не попало в прессу)– не потому, что кроили на сотрудниках, а потому что злые хакеры прокрались, и никто не виноват.

Случаи 1:1 как новогодний коллапс в Домодедово в 2010 – виновата погода, а не конкретные лица.

Получается, что есть только два класса: пролетариат и буржуазия.

Есть только два параметра, по которым можно оценить рынок. Это:
1) Число релевантных приглашений на интервью.
2) Число стадий \ время до найма.

Согласно мнению коллег, да и моему тоже, рынок ИТ в РФ сейчас встал. Реального поиска кандидатов нет, время простоя до найма 2-3 месяца, то есть найма нет. И это для квалифицированных специалистов.

Но и специалистов требуемой квалификации на рынке нет.

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

В то же время, на рынок действительно попала масса специалистов. Но есть нюанс, это масса не просто без ИТ образования или опыта, а масса без понимания, что они делают. Ну да, кнопочки нажимают, контейнер поднялся, все заработало. Логин пароль – админ \пароль, внутри всем можно все.

Вопрос, когда все сломается, даже не стоит – сломается вместе с первым сотрудником, сделавшим что-то «не то». Вся экономия на кадрах уйдет на компенсацию простоя. Но, это если экономию  будут считать честно. Может, наоборот, почти и не потеряли, даже и выиграли.

На это намазывается, таким толстым, жирным слоем, натуральное импортозаместительное .. ну, не масло*, а  точнее два его вида:
Качество импортозаместительного ПО.
Качество поддержки этого ПО, а точнее атаки на цепь поставок.
Это и непрямые атаки, как:

1) 2020 год, взлом SolarWinds Orion.
2) 2021 год, найденная, спустя десяток лет использования везде, уязвимость Log4j также известна как Log4Shell или CVE-2021-44228
3) 2023 год, последний случай из публичных:
Известный производитель чистящих средств Clorox подал в суд на своего IT-провайдера Cognizant после того, как выяснилось, что компания просто передала хакерам, выдававшим себя за сотрудников, доступ к корпоративной сети. Согласно отчету NBC News, этот инцидент позволил хакерской группе Scattered Spider, специализирующейся на атаках на сервисные службы компаний, заразить системы Clorox ransomware-вирусом в августе 2023 года. По данным иска, этот провал в IT-поддержке нанес Clorox ущерб и убытки на сумму около 380 миллионов долларов (~30,4 млрд рублей). Rutab.net
4) 2024 год, атака на xz/liblzma

И прямые атаки. Судя по опросу оставшихся в РФ коллег, в российском бизнесе забыт, как не бывший, результат EternalBlue \ Linux SambaCry \ CVE-2017-7494.
Точно так же, как забыт Conficker, (Downup, Downadup , Kido).

Можно считать, что завершилась сегментация рынка ИТ в РФ на:

Мелкий бизнес: который отлично себя чувствует на аутсорсе. 90% времени техника работает нормально и без постоянного присутствия специалиста, выдергивать и включать обратно хоть кассу, хоть карточный терминал, уже все научились. Зарплаты там низкие, квалификация соответствующая.

Средний бизнес: не заинтересованный в каких-то развитых технологиях. Я удивился, когда посмотрел на цифры производительности современных consumer SSD NVME – да, на нагрузке 24x7 они умрут, но на нагрузке «иногда днем» – выдают вполне достойные цифры. Enterprise SSD NVME опять подешевели. Квалификация в этом секторе разная, зарплаты тоже не высоки.

И, наконец, крупный бизнес. Найм туда остановлен организационно, обсуждать причины остановки найма нет смысла.

Найм в РФ стоит, зато те, кто уехал или работает на аутсорсе не из РФ, не то, чтоб в шоколаде (все же значимый процент бизнеса крутился через РФ), но не грустят.

Прогнозы

Ничего ставить не буду, разумеется, но бабка Ванга внутри меня говорит, что для РФ ИТ инфраструктуры в целом, включая сюда железо, сервисы, разработку – достигнут какой-то предел. Или рубеж. Или барьер. Потому что можно сколько угодно игнорировать проблему качества кадров, но она уже тут.

Но.

Проблемы с кадрами в авиастроении и в эксплуатации обсуждают, но не решают.
Проблемы с кадрами где угодно, начиная от врачей, и учителей обсуждают, но не решают.
Почему с ИТ кадрами, проблемы с которыми громко обсуждают, будет иначе?

Итого.

Судя по открытым вакансиям, и по реальным зарплатам на рынке, ситуация следующая.

Выпускник курсов, даже с враньем про опыт работы: не нужен. HR такой выпусник курсов пройдет. На техническом интервью завалится, потому что на курсах, ни на каких, не дают реального опыта работы. Дают опыт «как наврать в резюме». В мире, кстати, та же картина.

Начинающий специалист с хоть каким-то опытом, и, что очень важно, соответствующим мировоззрением.

Предлагаемая на рынке Москвы зарплата: от 50..80к до 100к. рублей. Практическая зарплата: 120-150к. разрыв с открытыми вакансиями x1.5 – x2 . Это не значит, что невозможно найти специалиста на 100к. Это значит, что такого специалиста надо полгода доучивать, и его совокупная стоимость составит:
100к (плюс налоги) плюс 25% времени от специалиста с окладом 150к за 6 месяцев, которого назначат «доучивать».
Потом этот доученный специалист через год еще и уйдет на 150к.
То есть, это все те же 1500$, что и 5, и 10, и 15 лет назад, с учетом инфляции по доллару.
Примечание. 1500 USD на 2025 год – это 1000 USD на 2010.
Инфляция за период: 50.42 %, используемый индекс: USCPI31011913 (Bureau of Labor Statistics).

Средний специалист на рынке. Здесь проблема в делении рынков, и определения середины.
HR меряют «середину» как «середину зарплаты по их мнению», но. Эта «середина по их мнению» никак не коррелирует с реальными зарплатами.
И, средняя и медианная зарплаты, это не одно и то же.
HR видят зарплаты, не закрываемые годами, в том числе не закрываемые потому, что там указана заниженная относительно рынка зарплата, читают новости «да сейчас точно 100.000.000.000 сотрудников выйдет на рынок и будет работать за большую честь работать в динамично развивающемся  лидере рынка за еду, выбирают из новостей «приятные», и дальше получают свою зарплату, не выполняя декларируемую бизнес задачу «найм». Если бизнес устраивает такое состояние найма, точнее «если, и когда», бизнес устраивает такое состояние найма и ИТ блока, когда на найм и удержание кадров можно не обращать внимания, то эта ситуация становится стабильной на годы. Растет технический долг, растут дыры, а потом случается Аэрофлот.

Более того, ИТ инфраструктура в целом, это проект с достаточно длительным развитием проблемы с регулированием, и с длительной амортизацией. То есть, нормально настроенная система (любая) предусматривает в себе требуемый бизнесом уровень надежности и скорости, и в ИТ не нужна ежедневная работа по закручиванию некой гайки или доливки смазки в кулер. Поэтому при увольнении даже 100% ИТ штата, системы не откажут (скорее всего не откажут) ни на следующий день, ни через неделю, ни, может, даже через месяц. Это ж какая экономия на кадрах.

Но, к теме.

Средний ИТ специалист на рынке Москвы, без разделения по направлениям и категориям, уже смотрит на западный рынок, и поэтому верхняя граница задрана.
По объявлениям это 100 - 200к, по факту это 250 – 750к.  Повторюсь, верхняя планка задрана потому, что хороший специалист среднего уровня по прежнему ориентируется на рынок Европы, а там МРОТ в районе 4000 евро до налогов, и 3000 евро после налогов. Да, снять квартиру в Лимассоле или Берлине встанет в 1000 евро, но и в Москве сравнимая квартира стоит 60-80 тысяч рублей плюс коммунальные платежи.
Примечание. МРОТ там ниже, но визовый порог плюс практический смысл для нанимающей стороны где-то так и выходит.
Конечно, если у специалиста в Москве есть еще мелкий побочный доход в виде пары квартир «от бабок», то ему западный рынок не интересен. В остальных случаях специалисты склонны сравнивать совокупные доходы, расходы, перспективы, и риски.
Разброс «предлагаемого» и «реального» рынка – в 2-3 раза. Повторюсь, все это идет от бизнеса, которого такое состояние устраивает, по каким-то бизнес-причинам.

Как там сказали на днях?

Женщина с фамилией Кузьминых ответила в комментариях пользователю, который пожаловался, что удаленщики могут потерять работу. «На СВО всем работы хватит», — написала она.
Также она процитировала пост Котюкова и предложила жителям края «радоваться чистому небу и не жужжать».
Источник РБК

Или как до этого:
Видеозаписи дочери Шевцовой заметили в сети в середине мая. На них девушка в агрессивной форме заявляла, что ее мама — мэр и может повлиять на призыв в армию. Одно из видео сопровождалось словами: «Ты что, фраер, попутал? Знаешь, кто моя мама? Мэр. Мы тебя на СВО отправим»./
Источник лентару

Или до того:
«Я вам могу составить меню исходя из тех магазинов, которые я посещаю, со скидками, и вы поймете, что жить можно! Сбалансированное, но диетическое! Вы станете моложе, красивее и стройнее! Макарошки всегда стоят одинаково!» — заявила министр труда.
Источник бизнес онлайн

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

Страннее всего с рынком «сеньоров», «тим лидов» и выше.
Это и в мире, и в РФ, всегда или переходная позиция «к менеджменту», или больше менеджерская.
Поэтому на ней можно выделить две совершенно разных группы.
Группа 1. Технические сеньоры без задач управления, консультанты.
HR в РФ их ищут как «сеньоров», расписывая при этом на них несколько технических задач из не связанных блоков, добавляя управленческие задачи, и добавляя, чтобы точно никого не найти, «наставничество». При этом оклад выставляется на уровне мидл плюс.
Выставляемый оклад: 250-500к рублей, но фактически там минимальный уровень 400-450к, а в итоговом годовом окладе уже имеются KPI, и премия там легко может быть и в 6, и в 9, и в 12 месячных окладов.
Группа 2. Менеджеры с минимальным техническим бекграундом.
После серии про эффективную сову тут уже нечего добавить.

Отдельной жизнью живут вакансии по информационной безопасности. В ней разброс окладов еще выше, особенно там, где эта безопасность нужна, и приносит прибыль.

Повторюсь еще раз.
Проблемы с наймом растут не от HR или hh. Проблемы растут от бизнеса, которого устраивает такое положение дел. На это накладывается откат от 4---- технологического уклада в РФ на уровень 3+++, а местами и на уровень 2++, с соответствующим откатом мотивации и агитации на уровень СССР, с  его «План - закон, выполнение - долг, перевыполнение - честь!» и «это не про зарплату, а про призвание». ИТ это затрагивает ничуть не меньше остального рынка труда.
Надо заметить, эта агитация работает, часть коллектива уже поверила, что «надо работать на хорошее резюме, чтобы HR не ругались на то, что я работал на последнем месте меньше года / трех лет / пяти лет / всю жизнь». Но есть интересная корреляция, когда люди, поверившие в длительность стажа на месте работы, уже не учатся чему-то новому. То есть, на словах они готовы учить английский и немецкий, учить новый стек, новые технологии и подходы, а по факту откладывают это на понедельник, следующий месяц, отпуск, как только так сразу.
Рекорд поставила одна из бывших коллег, которая собиралась пойти учить английский в 2019 году. Потом работа, потом ковид, потом новая работа, а потом вроде уже и не надо. И с остальными знаниями у нее то же самое. Теперь сидит и ноет, что новая работа «не очень», но менять ее не будет, потому что «ну как же я HR в глаза смотреть буду, я же не отработала тут 3\5\10 лет».

PS. На западном рынке, США и Европы, тоже ноют про кадры.
Внешне ноют «похоже», но с другим содержанием. Поэтому без анализа я уже давно не удивляюсь обратному карго-культу, когда в РФ ноют «как же так, их самолеты тоже из навоза, инфа 100%, что они тоже не летают, просто лучше притворяются».

Литература

50 Famous CEOs Who Got Fired From Their Job
5 взломов ИБ-компаний за неделю, в которых фигурировали EDR и средства аутентификации Сайт Алексей Лукацкого "Бизнес без опасности", 2025

SolarWinds урегулировала дело о скандальном взломе пятилетней давности, который затронул тысячи компаний и госслужбы
Время сверить версии: в Linux выявлена изощрённая атака на цепочку поставок
Атаки на цепочки поставок: как уязвимости распространяются через зависимости
SambaCry к нам приходит
https://ru.wikipedia.org/wiki/Карго-культ
Обратный карго-культ (Ведомости)
Human Resource Management in a Recession

*
Встречается Брежнев с советскими учёными.
-Товарищи! В Советском Союзе острая нехватка сливочного масла! Нужно срочно создать ему замену.
-А чего в Советском Союзе много, Леонид Ильич?
-А много у нас только говна.

-Хорошо, будем работать.
Выделили 50 миллионов рублей и установили срок в четыре года. Через два года Брежнев возвращается.
-Ну что, как идёт дело, товарищи учёные?
-Полдела сделано, Леонид Ильич. На хлеб легко мажется, но на вкус пока не очень.

Показать полностью
11

Забавная дилемма

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

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

#comment_361465366 - в дополнение

29

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов

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

❗ Важно: Я пишу про PS7 (PowerShell 7). Он отличается от PS5 (PowerShell 5). Начиная с седьмой версии ps стал кросплатформенным. Из-за этого изменилось поведение некоторых команд.

В первой части мы установили ключевой принцип: PowerShell работает с объектами, а не с текстом. Этот пост посвящен некоторым важным инструментам PowerShell: научимся передавать объекты по конвейеру, анализировать их с помощью Get-Member, сохранять результаты в переменные и автоматизировать все это в файлах скриптов (.ps1) с экспортом результатов в удобные форматы.


1. Что такое конвейер (|)?

Конвейер в PowerShell это механизм передачи полноценных .NET объектов (а не просто текста) от одной команды к другой, где каждый следующий командлет получает структурированные объекты со всеми их свойствами и методами.

Символ | (вертикальная черта) — это оператор конвейера. Его задача — взять результат (вывод) команды, стоящей слева от него, и передать его на вход команде, стоящей справа.

Команда 1 (создает объекты) → | → Команда 2 (получает и обрабатывает объекты) → | → Команда 3 (получает обработанные объекты) → | ...

Классический UNIX-конвейер: Поток текста

В bash по конвейеру передается поток байтов, который обычно интерпретируется как текст.

Найти все процессы 'nginx' и посчитать их количество
> ps -ef | grep 'nginx' | wc -l

Здесь `ps` выводит текст, `grep` фильтрует этот текст, а `wc` считает строки. Каждая утилита ничего не знает о "процессах", она работает только со строками.

PowerShell-конвейер: Поток объектов

Пример: Давайте получим все процессы, отсортируем их по использованию CPU и выберем 5 самых "прожорливых".

> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5

Здесь Get-Process создает объекты процессов. Sort-Object получает эти объекты и сортирует их по свойству CPU. Select-Object получает отсортированные объекты и выбирает первые 5.

Вы наверняка заметили в команде слова, начинающиеся с дефиса (-): -Property, -Descending, -First. Это параметры. Параметры — это настройки, переключатели и инструкции для командлета. Они позволяют управлять тем, КАК команда будет выполнять свою работу. Без параметров команда работает в режиме по умолчанию, а с параметрами вы даете ей конкретные указания.

Основные типы параметров:

  • Параметр со значением: требует дополнительной информации.

    -Property CPU: Мы говорим Sort-Object, по какому свойству сортировать. CPU — это значение параметра.

    -First 5: Мы говорим Select-Object, сколько объектов выбрать. 5 — это значение параметра.

  • Параметр-переключатель (флаг): Не требует значения. Само его наличие в команде включает или выключает определенное поведение.

    -Descending: Этот флаг говорит Sort-Object изменить порядок сортировки на обратный (от большего к меньшему). Ему не нужно дополнительное значение — он сам по себе инструкция.

> Get-Process -Name 'svchost' | Measure-Object

Эта команда отвечает на очень простой вопрос: "Сколько именно процессов с именем svchost.exe сейчас запущено в моей системе?"

Разбор по шагам

Шаг 1: Get-Process -Name 'svchost'

Эта часть команды обращается к операционной системе и просит найти все без исключения запущенные процессы, у которых имя исполняемого файла — svchost.exe. В отличие от процессов типа notepad (которых обычно один или два), процессов svchost в системе всегда много. Команда вернет массив (коллекцию) объектов, где каждый объект — это отдельный, полноценный процесс svchost со своим уникальным ID, использованием памяти и т.д. PowerShell нашел в системе, например, 90 процессов svchost и теперь держит в руках коллекцию из 90 объектов.

Шаг 2: | (Оператор конвейера)

Этот символ берет коллекцию из 90 объектов svchost, полученную на первом шаге, и начинает передавать их по одному на вход следующей команде.

Шаг 3: Measure-Object

Поскольку мы вызвали Measure-Object без параметров (таких как -Property, -Sum и т.д.), он выполняет свою операцию по умолчанию — просто считает количество "предметов", которые ему передали. Раз, два, три ... После того как все объекты посчитаны, Measure-Object создает свой собственный объект-результат, в котором есть свойство Count, равное итоговому числу.

Count: 90 — это и есть ответ на наш вопрос. Запущено 90 процессов svchost. Остальные поля пустые, потому что мы не просили Measure-Object выполнять более сложные вычисления.

Пример с svchost и параметрами

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

Для этого нам понадобятся параметры:

  • -Property WorkingSet64: Эта инструкция говорит Measure-Object: "Из каждого объекта svchost, который к тебе придет, возьми числовое значение из свойства WorkingSet64 (это использование памяти в байтах)".

  • -Sum: Эта инструкция-флаг говорит: "Сложи все эти значения, которые ты взял из свойства WorkingSet64".

Наша новая команда будет выглядеть так:

> Get-Process -Name 'svchost' | Measure-Object -Property WorkingSet64 -Sum

  1. Get-Process найдет количество объектов svchost.

  2. Конвейер | передаст их в Measure-Object.

  3. Но теперь Measure-Object работает по-новому:

    • Он берет первый объект svchost, смотрит его свойство .WorkingSet64 (например, 25000000 байт) и запоминает это число.

    • Берет второй объект, смотрит его .WorkingSet64 (например, 15000000 байт) и прибавляет к предыдущему.

    • ...и так далее для всех объектов.

  4. В итоге Measure-Object создаст объект-результат, но теперь он будет другим.

  • Count: 92: Количество объектов.

  • Sum: 1661890560: Это общая сумма всех значений WorkingSet64 в байтах.

  • Property: WorkingSet64: Это поле теперь тоже заполнено, оно информирует нас, какое именно свойство было использовано для вычислений.

2. Переменные (Обычные и специальная $_)

Переменная — это именованное хранилище в памяти, которое содержит какое-либо значение.

Этим значением может быть что угодно: текст, число, дата или, что самое важное для PowerShell, целый объект или даже коллекция объектов. Имя переменной в PowerShell всегда начинается со знака доллара ($). Примеры: $name, $counter, $processList.

Специальная переменная $_?

$_ — это сокращение для "текущий объект" или "вот эта штука". Представьте себе конвейер на заводе. По нему едут разные детали (объекты).

$_ — это та самая деталь, которая находится прямо сейчас перед вами (или перед роботом-обработчиком).

Источник (Get-Process) — высыпает на конвейер целую коробку с деталями (всеми процессами).

Конвейер (|) — заставляет эти детали двигаться по ленте по одной.

Обработчик (Where-Object или ForEach-Object) — это робот, который смотрит на каждую деталь.

Переменная $_ — это та самая деталь, которая сейчас находится в "руках" у робота.

Когда робот закончит с одной деталью, конвейер подает ему следующую, и $_ теперь будет указывать уже на нее.

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

1. Выполняем команду и сохраняем ее сложный объект-результат в переменную $svchostMemory

> $svchostMemory = Get-Process -Name svchost | Measure-Object -Property WorkingSet64 -Sum

2. Теперь мы можем работать с сохраненным объектом. Достаем из него свойство Sum

> $memoryInMB = $svchostMemory.Sum / 1MB

3. Выводим результат на экран, используя новую переменную

> Write-Host "Все процессы svchost используют $memoryInMB МБ памяти."

  • Write-Host — это специализированный командлет, чья единственная задача — показать текст непосредственно пользователю в консоли.

  • Строка в двойных кавычках: "..." - текстовая строка, которую мы передаем командлету Write-Host в качестве аргумента. Почему двойные, а не одинарные кавычки?

    В PowerShell есть два типа кавычек:

    • Одинарные ('...'): Создают буквальную строку. Все, что внутри них, воспринимается как обычный текст, без исключений.

    • Двойные ("..."): Создают расширяемую (или подстановочную) строку. PowerShell "сканирует" такую строку на предмет переменных (начинающихся с $) и подставляет на их место их значения.

  • $memoryInMB. Это переменная, в которую мы на предыдущем шаге нашего скрипта положили результат вычислений. Когда Write-Host получает строку в двойных кавычках, происходит процесс, называемый "подстановка переменных" (String Expansion):

    1. PowerShell видит текст "Все процессы svchost используют ".

    2. Затем он натыкается на конструкцию $memoryInMB. Он понимает, что это не просто текст, а переменная.

    3. Он заглядывает в память, находит значение, хранящееся в $memoryInMB (например, 1585.52).

    4. Он подставляет это значение прямо в строку.

    5. Затем он добавляет оставшуюся часть текста: " МБ памяти.".

    6. В итоге, в Write-Host передается уже готовая, собранная строка: "Все процессы svchost используют 1585.52 МБ памяти.".

Запустите блокнот!

  1. Находим процесс Блокнота и сохраняем его в переменную $notepadProcess

> $notepadProcess = Get-Process -Name notepad

  1. Обращаемся к свойству 'Id' этого объекта через точку и выводим его

> Write-Host "ID процесса 'Блокнот' равен: $($notepadProcess.Id)"

❗ Важно: Write-Host "ломает" конвейер. Текст, выведенный им, нельзя передать дальше по конвейеру для обработки. Он предназначен только для отображения.


3. Get-Member (Инспектор объектов)

Мы знаем, что по конвейеру "текут" объекты. Но как узнать, из чего они состоят? Какие у них есть свойства и какие действия (методы) с ними можно совершать?

командлет Get-Member (псевдоним: gm) главный инструмент для исследования. Прежде чем работать с объектом, пропустите его через Get-Member, чтобы увидеть все его возможности.

Давайте проанализируем объекты, которые создает Get-Process:

> Get-Process | Get-Member

Разберем каждую часть вывода Get-Member.

TypeName: System.Diagnostics.Process - Это полное, официальное "имя типа" объекта из библиотеки .NET. Это его "паспорт". Эта строка говорит вам, что все объекты, которые возвращает Get-Process, являются объектами типа System.Diagnostics.Process. Это гарантирует, что у них у всех будет одинаковый набор свойств и методов. Вы можете загуглить "System.Diagnostics.Process", чтобы найти официальную документацию Microsoft с еще более подробной информацией.

  • Колонка 1: Name

Это простое, человекочитаемое имя свойства, метода или другого "члена" объекта. Именно это имя вы будете использовать в своем коде для доступа к данным или выполнения действий.

  • Колонка 2: MemberType (Тип объекта)

Это самая важная для понимания колонка. Она классифицирует, чем является каждый объект. Это его "должность", которая говорит вам, КАК его использовать.

  • Property (Свойство): характеристика или порция данных, хранящаяся внутри объекта. Вы можете "прочитать" ее значение.

    • Примеры на скриншоте: BasePriority, HandleCount, ExitCode. Это просто данные, которые можно посмотреть.

  • Method (Метод): ДЕЙСТВИЕ, которое можно совершить с объектом. Методы всегда вызываются с круглыми скобками ().

    • Примеры на скриншоте: Kill, Refresh, WaitForExit. Вы бы написали $process.Kill() или $process.Refresh().

  • AliasProperty (Псевдоним свойства): дружелюбный псевдоним для другого, более длинного свойства. PowerShell добавляет их для удобства и краткости.

    • Примеры на скриншоте: WS — это короткий псевдоним для WorkingSet64. Name — для ProcessName. VM — для VirtualMemorySize64.

  • Event (Событие): УВЕДОМЛЕНИЕ о том, что что-то произошло, на которое можно "подписаться".

    • Пример на скриншоте: Exited. Ваш скрипт может "слушать" это событие, чтобы выполнить какое-то действие сразу после того, как процесс завершится.

  • CodeProperty и NoteProperty: специальные типы свойств, часто добавляемые самим PowerShell для удобства. CodeProperty вычисляет свое значение "на лету", а NoteProperty — это простое свойство-заметка, добавленное к объекту.

  • Колонка 3: Definition (Определение)

Это техническое определение или "подпись" члена. Она дает вам точные детали для его использования. Ее содержимое зависит от MemberType:

  • Для AliasProperty: Показывает, чему равен псевдоним. Это невероятно полезно!

    • Пример на скриншоте: WS = WorkingSet64. Вы сразу видите, что WS — это просто короткая запись для WorkingSet64.

  • Для Property: Показывает тип данных, который хранится в свойстве (например, int для целого числа, string для текста, datetime для даты и времени), и что можно с ним делать ({get;} — только читать, {get;set;} — читать и изменять).

    • Пример на скриншоте: int BasePriority {get;}. Это целочисленное свойство, которое можно только прочитать.

  • Для Method: Показывает, что метод возвращает (например, void — ничего, bool — true/false) и какие параметры (входные данные) он принимает в скобках.

    • Пример на скриншоте: void Kill(). Это значит, что метод Kill ничего не возвращает и может быть вызван без параметров. Также есть вторая версия void Kill(bool entireProcessTree), которая принимает логическое значение (true/false).

В виде таблицы

Пример: Работа с окнами процессов

1. Проблема:

"Я открыл много окон Блокнота. Как мне программно свернуть все, кроме главного, а затем закрыть только то, у которого в заголовке есть слово 'Untitled'?"

Откройте несколько экземпляров блокнота (Windows Notepad) на компьютере

2. Исследование с Get-Member:

Нам нужно найти свойства, связанные с окном и его заголовком.

> Get-Process -Name notepad | Get-Member

Анализ результата Get-Member:

  • Листая свойства, мы находим MainWindowTitle. Тип string. Отлично, это заголовок главного окна!

  • В методах мы видим CloseMainWindow(). Это более "мягкий" способ закрыть окно, чем Kill().

  • Также в методах есть WaitForInputIdle(). Звучит интересно, возможно, это поможет дождаться, пока процесс будет готов к взаимодействию.

Get-Member показал нам свойство MainWindowTitle, которое является ключом к решению задачи и позволяет взаимодействовать с процессами на основе состояния их окон, а не просто по имени.

3. Решение:

Теперь мы можем построить логику, основанную на заголовке окна.


Пример: Найти родительский процесс

1. Проблема:

"Иногда я вижу в системе много дочерних процессов chrome.exe. Как мне узнать, какой из них является главным, "родительским" процессом, который их всех запустил?"

2. Исследование с Get-Member:

Нам нужно найти что-то, что связывает один процесс с другим.

> Get-Process -Name chrome | Select-Object -First 1 | Get-Member

Анализ результата Get-Member:

  • Внимательно просматривая список, мы находим свойство типа CodeProperty с именем Parent.

  • Его определение (Definition) — System.Diagnostics.Process Parent{get=GetParentProcess;}. Это вычисляемое свойство, которое при обращении к нему возвращает объект родительского процесса.

3. Решение:

Теперь мы можем написать скрипт, который для каждого процесса chrome будет выводить информацию о его родителе.

Мы сразу видим, что процессы с ID 4756, 7936, 8268 и 9752 были запущены процессом с ID 14908. Также можно заметить интересный случай с процессом ID: 7252, у которого родительский процесс не определился (возможно, родитель уже успел завершиться к моменту проверки). Модификация скрипта с проверкой if ($parent) аккуратно обрабатывает этот случай, не вызывая ошибки. Get-Member помог нам обнаружить "скрытое" свойство Parent, которое предоставляет мощные возможности для анализа иерархии процессов.

4. Файл .ps1 (Создание скриптов)

Когда ваша цепочка команд становится полезной, вы захотите сохранить ее для многократного использования. Для этого и нужны скрипты — текстовые файлы с расширением .ps1.

Разрешение на запуск скриптов

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

> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

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

Пример скрипта system_monitor.ps1

Создайте файл с таким именем и вставьте в него код ниже. Этот скрипт собирает информацию о системе и генерирует отчеты.

Примечание: функция Export-Results будет определена в следующем разделе как пример хорошей практики.

5. Экспорт результатов

Чистые данные — это хорошо, но часто их нужно представить в удобном для человека или другой программы виде. PowerShell предлагает множество командлетов для экспорта.

Дополнение к скрипту: функция экспорта

Давайте добавим в наш скрипт system_monitor.ps1 функцию, которая будет заниматься экспортом. Поместите этот код перед вызовом Export-Results.

код на github

Теперь наш скрипт не просто собирает данные, но и аккуратно сохраняет их в двух форматах: CSV для анализа и HTML для быстрого просмотра.

Заключение

  1. Конвейер (|) — главный инструмент для объединения команд и обработки объектов.

  2. Get-Member — анализ объектов, который показывает, из чего они состоят.

  3. Переменные ($var, $_) позволяют сохранять данные и обращаться к текущему объекту в конвейере.

  4. Файлы .ps1 превращают команды в переиспользуемые инструменты автоматизации.

  5. Командлеты экспорта (Export-Csv, ConvertTo-Html) Экспортируют данные в соответствующем формате.

В следующей части мы применим эти знания для навигации и управления файловой системой, исследуя объекты System.IO.DirectoryInfo и System.IO.FileInfo.

К первой части

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

UPD:

Статья на github:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/02.md

Исходники:
system-monitor.ps1:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/code/02/system_monitor.ps1


Третья часть:
Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

А давайте встроим ии в powershell

Показать полностью 19
2

Новый ноутбук 2: скорость, плюсы-минусы, DiskSPD, Hyper-V и далее

Для лиги лени: привыкание к новому и бесполезные тесты часть следующая. И немного powershell

Начало тут:

Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 1 - общая
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 2 - виртуализация
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 3 – цифры и предварительные итоги
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 4 – что там изнутри виртуализации
Новый ноутбук: скорость, плюсы-минусы, DiskSPD, Hyper-V и продолжение про методику тестирование скорости

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

Предупреждение еще раз. Все данные ниже можно принимать во внимание, но не стоит рассматривать как какой-то эталон.

Что получил:

Один тред, один файл, блок 4k на чтение.

1 Влияние длины очереди. Тут была таблица, но не вставилась, поэтому просто цифрами:

После очереди == 4, нагрузка не растет, около 90k IOPS

2 Влияние числа тредов и числа файлов в работе на общий IOPS

Примечание: для 2 и 3 файлов – один файл был размещен на другом логическом диске

Тут тоже была таблица, но мне лень вставлять ее даже картинкой. На картинке опечатка, везде k, тысячи IOPS.

IOPS

IOPS

Затем общий IOPS не рос.

До 10 тредов IOPS на поток падало – с 40 тысяч при 1 треде на каждый файл.
При соотношении 2 файла \ 3 треда, всего 6 тредов, и 3 файла \ 2 треда – выйдя на примерно 40k IOPS на поток, при 4 тредах и 3 файлах просев до 33-35 k IOPS на поток

На 14 (7\2) и 15 (5\3) тредах начинает падать IOPS\thread – с 35 до 17.
На 14 – 10 по 35k, 4 по 17k
на 15 – 9 треда по 35k, 3 треда по 17k.
Что отлично укладывается в логику 12 тредов CPU, из которых 9 работают на один тред, генерируя по 35k, и 3 CPU потока обрабатывают по 2 дисковых треда по 17k.
На 24 тредах (2 файла \ 12 тредов и 3 файла \ 8 тредов)  картинка та же – все треды примерно по 17.5 IOPS
На 26 тредах (2\13 и 3\12) -4-6 потоков падают до 10k IOPS \ thread. Суммарно те же 40k

И для записи, пиковое значение было получено при 2 тредах на каждый их 3 файлов, 240k IOPS итого, по 40k IOPS на тред. Затем было только хуже –

Например, на казалось бы ПОЧТИ то же самое, 3 треда на два файла – производительность упала до 20k на тред, 120k IOPS.

На 4 потоках на файл, 12 файлах – производительность вроде бы была 210k, но есть разброс – от 15 до 20k IOPS на тред, перемерять надо.

На этом обзор физики можно и закончить, с выводами:
AMD потоки работают интереснее, чем у Intel, в именно этой реализации.
Максимальная производительность по чтению по дисковым операциям на физическом хосте достигается на числе потоков данных = числу потоков CPU
Производительность на чтение от очереди зависит достаточно слабо, то есть на очереди 8 выжало не 430, а 440k IOPS, на очереди 16 и 32 – 450k IOPS.

Внезапно, наловил ошибок – удалил старые файлы тестов, а новые, с тем же именем, не создаются!
There has been an error during threads execution
Error generating I/O requests
Оказалось, в какой-то момент в середине ночи удалил параметр с размером файлов.  Случайно. И даже не заметил. Поправил и завелось.

И, наконец, влияние read-modify-write для любителей дисков потолще.

Показать не удалось, потому что:
Картина на файле 10 гигабайт и длительности записи 10 секунд и прогреве W=10

Картина приплыли на файле 200 гигабайт при прогреве W=2

До этого прогрев был W=10. И, в таблице ниже, 3.5k это не опечатка, 3500 IOPS

Везде забыл проставить k, это тысячи IOPS

Везде забыл проставить k, это тысячи IOPS

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

Потому что ничего не понятно, кроме того, что не зря замерял при разных параметрах. Получить лажу и увидеть ее полезно.

Перейдем к SQLsim.
Для опытов был взят Microsoft® SQL Server® 2019 Express,
Будете ставить – не забывайте сразу качать SQL Server Management Studio, пригодится.

файл отдельно не качается (я не нашел), поэтому скачал, поставил и вот -
C:\Program Files\Microsoft SQL Server\MSSQLXX.<InstanceName>\MSSQL\Binn

В GUI варианте теста «по умолчанию» ничего сложного – размеры файлов, размещение, число циклов, длина теста. Просто, наглядно.

Одна проблема – по умолчанию на 1 цикл поставлено 600 секунд (10 минут), и 12 циклов – то есть базовый тест – это два часа.

В конце теста генерируется sqliosim.log.xml.

Вторая проблема: тест не выдает в итоге каких-то цифр, типа «вы молодец, давайте дальше» - только таблицу

Display Monitor ********** Final Summary for file sqliosim.ldx ********** CLogicalFile::OutputSummary fileio.cpp

Display Monitor File Attributes: Compression = No, Encryption = No, Sparse = No CLogicalFile::OutputSummary fileio.cpp

Display Monitor Target IO Duration (ms) = 100, Running Average IO Duration (ms) = 0, Number of times IO throttled = NN, IO request blocks = NN CLogicalFile::OutputSummary fileio.cpp

Display Monitor Reads = NN, Scatter Reads = 0, Writes = NN, Gather Writes = 0, Total IO Time (ms) = NN CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Sector size = 512, Cylinders = NN, Media type = NN, Sectors per track = 63, Tracks per Cylinders = 255 CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Read cache enabled = Yes, Write cache enabled = Yes CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Read count = BB, Read time = BB, Write count = BB, Write time = NN, Idle time = NN, Bytes read = NN, Bytes written = NN, Split IO Count = 0, Storage number = NN, Storage manager name = VOLMGR  CLogicalFile::OutputSummary fileio.cpp

Я молодец, ок, а дальше что?

Конечно, если вы молодец (как я), то будете смотреть не только в окно самой программы, а запустите resmon и будете смотреть нагрузку по дискам, очереди, задержки, etc.

Перейду к hammerdb .. но это уже другая история.

В следующих сериях, теперь уже точно!
Опыты на виртуальной машине на 3 ядра.

CPU affinity
Опыты на Debian внутри Hyper-V, опыты с Proxmox nested. Stay tuned!

Литература

Performance benchmark test recommendations for Azure NetApp Files
Azure NetApp Files regular volume performance benchmarks for Linux
Hidden Treasure Part 1: Additional Performance Insights in DISKSPD XML
Hidden Treasure Part 2: Mining Additional Insights

Command line and parameters
Customizing tests
Use an XML file to provide DiskSpd parameters
Use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem

SQL Server I/O Basics, Chapter 2
Use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem on Linux
SQLIOSim Create a realistic I/O load for stress-testing SQL Server 2005

about_Comparison_Operators
about_Assignment_Operators

hammerdb Documentation

PS

И немного powershell.

Часть 1, которую вы уже видели

$pciStats = (Get-WMIObject Win32_Bus -Filter 'DeviceID like "PCI%"').GetRelated('Win32_PnPEntity') |

foreach {

# request connection properties from wmi

[pscustomobject][ordered]@{

Name = $_.Name

ExpressSpecVersion=$_.GetDeviceProperties('DEVPKEY_PciDevice_ExpressSpecVersion').deviceProperties.data

MaxLinkSpeed  =$_.GetDeviceProperties('DEVPKEY_PciDevice_MaxLinkSpeed'  ).deviceProperties.data

MaxLinkWidth  =$_.GetDeviceProperties('DEVPKEY_PciDevice_MaxLinkWidth'  ).deviceProperties.data

CurrentLinkSpeed  =$_.GetDeviceProperties('DEVPKEY_PciDevice_CurrentLinkSpeed'  ).deviceProperties.data

CurrentLinkWidth  =$_.GetDeviceProperties('DEVPKEY_PciDevice_CurrentLinkWidth'  ).deviceProperties.data

} |

# only keep devices with PCI connections

Where MaxLinkSpeed

}

$pciStats | Format-Table -AutoSize


Get-CimInstance -ClassName Win32_Volume | Select-Object DriveLetter, FileSystem, BlockSize| Format-Table -AutoSize


$Path001 = 'C:\DiskSpd\amd64\'

$Sp = $Path001 + "diskspd.exe"

cd $Path001

$Rn = Get-Random -Minimum 1 -Maximum 10

$Version = "070_" + $Rn


$Drives = @("C")

$FilesTemp = "Data4del"

$File001 = "deleteme_01a.dm"

$File002 = "deleteme_02a.dm"

$File003 = "deleteme_03a.dm"

$Out021 = $Drives[0] + ':\' + $FilesTemp + '\' + $File001

$Out022 = $Drives[0] + ':\' + $FilesTemp + '\' + $File002

$Out023 = "D" + ':\' + $FilesTemp + '\' + $File003

# $OutsFilesAA = @("$Out021", "$Out023", "$Out021 $Out022","$Out021 $Out023","$Out021 $Out022 $Out023") - не работает вот так и все.

$OutsFilesAA = @( "$Out022")

$Logs = @()

$Threads = @("-t1","-t2", "-t3", "-t4","-t5","-t6","-t7","-t8","-t9","-t10","-t11","-t12","-t13","-t14","-t15")

# $Threads = @("-t1")

# $Write = ("-w0","-w30", "-w100")

$Write = @("-w100")

#$BlockSize = ("-b4k","-b8k")

$BlockSize = @("-b4k")

# $Outstanding = @("-o2","-o4","-o8","-o16","-o32")

$Outstanding = @("-o2")

$Size = "-c200G"

$Time = "-d10"


foreach ($OutFilesGr in $OutsFilesAA){

foreach ($Drv in $Drives){

foreach ($Bl in $BlockSize) {

foreach ($Wr in $Write) {

foreach ($Outs in $Outstanding){

foreach ($T1 in $Threads){


$TimeNow = get-date -UFormat "-%d-%m-%Y-%R" | ForEach-Object {$_ -replace ":","-"}

Write-Host "TT " $TimeNow

$Out001 = $Drv + ':\' + $FilesTemp + '\' + $File001

$Out002 = $Drv + ':\' + $FilesTemp + '\' + $File002

$Out003 = "D" + ':\' + $FilesTemp + '\' + $File003


$Stat1 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_1.log'

$Stat2 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_2.log'

$Stat3 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_3.log'

$Logs += $Stat1


Write-Host "testing mode " $T1 $Wr $Bl $Outs 'time' $Time # "GR" $OutFilesGr

# &$Sp $T1 $Wr $Bl -W10 $Outs $Time -Suw -D -L $Size $Out021 $Out022 > $Stat1

&$Sp $T1 $Wr $Bl -W10 $Outs $Time -Suw -D -L $Size $Out021 > $Stat1

}}}}}}

И часть 2

$FilesTempDir = "c:\Data4del\"

$StatFiles = "069"

$StatFilesList = Get-ChildItem -Path $FilesTempDir | Where-Object {$_.Name -like ($StatFiles + '*') | Sort-Object -Property CreationTime  }


foreach ($MyFile in $StatFilesList){

$TempData1 = Get-Content $MyFile.FullName  | Where-Object {$_ -like "Command Line*"}

$TempData1

$TempData2 = Get-Content $MyFile.FullName  | Where-Object {$_ -like "total:*"}

$TempData2

}

Показать полностью 3
Отличная работа, все прочитано!