В админиcтрировании всегда есть место творчеству. Хочешь сделать какую-нибудь автоматизацию рутинной задачи? Пожалуйста! Нужно что-то регулярно проверять на активность? Не вопрос! Хочешь обработать какой-нибудь гигантский отчет и вывести только актуальные данные? Тоже можно. Все эти и многие другие задачи лучше всего решать при помощи скриптов, и язык PowerShell в случае с Windows — оптимальный выбор.
ответа
Лучший ответ
Используйте оператор -replace с регулярным выражением:
Get-ChildItem | Rename-Item -NewName { $_.Name -replace ‘^([^_-]+-[^_-]+)-‘, ‘$1_’ } -WhatIf
-WhatIf предварительный просмотр операции переименования; удалите его, чтобы выполнить фактическое переименование.
-
Regex ‘^([^_-]+-[^_-]+)-‘ захватывает первые два — разделенных токена в начале (^) имени файла, используя группу захвата ((…)) для захвата токенов, исключая 2-й — .
- [^_-]+ фиксирует любой непустой набор символов, которые не являются ни -, ни _. _ также исключен для предотвращения ложных срабатываний с именами файлов, которые уже являются правильными; для тех, кто не исключил _, он сопоставит первые токены 3 и вставит туда дополнительные _.
-
Операнд замены $1_ затем использует значение 1-й (и единственной) группы захвата ($1), за которым следует литерал _, чтобы заменить то, что сопоставлено регулярному выражению, которое фактически заменяет 2-е {{ X3}} с _.
-
Если данное имя файла не соответствует регулярному выражению (если оно уже правильно), оно возвращается как есть, что является тихим запретом в контексте Rename-Item.
4 mklement0 16 Ноя 2018 в 19:21
Вы можете разбить строку на первые два вхождения -, а затем объединить их с помощью — и _:
$name = » $first,$second,$rest = $name -split ‘-‘,3 $newName = «${first}-${second}_${rest}» 1 Mathias R. Jessen 15 Ноя 2018 в 22:59
- switch в Windows PowerShell …
- Основы PowerShell: определение конца …
- Проблемы с использованием регулярного …
Глядя на ваши примеры, кажется, что второй — всегда появляется между числами. Что-то вроде $Variable -replace ‘REGEX’,’_’
Использование приведенного ниже регулярного выражения будет соответствовать тем.
(?<=[0-9])(.)(?=[0-9])
() создает группу для сопоставления, это группа захвата.
?<= является положительным взглядом сзади, он соответствует группе перед основным выражением, не включая его в результаты
[0-9] — это набор символов, соответствующий любому значению от 0 до 9.
. соответствует любому символу, кроме переносов строк
?= является положительным взглядом, он соответствует группе после основного выражения, не включая его в результаты
Я рекомендую использовать Regexr для тестирования и изучения Regex.
1 Drew 15 Ноя 2018 в 22:41
Как насчет этого RegEx: (?<=(^|\n)[^-]*-[^-]*)-?
Или как полная команда (используя ответы на Заменить часть имени файла Powershell) :
Get-ChildItem | Rename-Item -NewName {$_.name -replace ‘(?<=^[^-_]+-[^-_]+)-‘,’_’}
Изменить: включенные предложения от @ mklement0
1 Solomon Ucko 16 Ноя 2018 в 18:21
Командлеты
Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:
- существуют системные, пользовательские и опциональные командлеты;
- результатом выполнения командлета будет объект или массив объектов;
- командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
- командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser, get-aduser и gEt-AdUsEr;
- в качестве разделителя используется символ ; .
Каждый командлет содержит в себе глагол и существительное, разделяемые дефисом. Например:
- Get-Process — отобразить текущие процессы, запущенные на компьютере;
- Get-Service — отобразить список служб и их статус;
- Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts.
При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.
Результат выполнения команды Get-Help-Category
Также можно создавать свои командлеты, но эта тема выходит за рамки нашего руководства по PowerShell для начинающих.
Выбираем среду разработки и инструменты
Теперь давай разберемся, где удобнее всего писать код. Можно, конечно, и в «Блокноте», Notepad++ или Sublime. Но это в данном случае не самый грамотный выбор редактора. Лучше всего начинать знакомство с PowerShell, вооружившись идущим в комплекте PowerShell ISE.

PowerShell ISEДругие статьи в выпуске: Xakep #214. Приручаем WAF’ы
- Содержание выпуска
- Подписка на «Хакер»

Это даже не редактор, а практически полноценная среда разработки. Здесь есть функция IntelliSense, которая позволяет просматривать перечень командлетов и их параметров, переменных, утилит и прочего. Поддерживаются сниппеты, есть возможность расширения набора функций за счет различных аддонов. Очень полезно и окно Commands. В нем можно составлять команды в визуальном режиме: выбираешь модуль, находишь нужный командлет и задаешь ему необходимые параметры. Получившуюся команду можно скопировать в консоль или сразу запустить на выполнение. В общем, этакий конструктор для админа. Ну и конечно, есть подсветка синтаксиса, дебаггер и многое другое.
Тем не менее у PowerShell ISE есть и достойные конкуренты. Один из них — Dell PowerGUI.

PowerGUI — это визуальное дополнение к PowerShell. Оно упрощает сборку собственных сценариев до выбора необходимых командлетов. Берешь то, что нужно для решения задачи, и перетаскиваешь части кода, пока не получишь скрипт. Одна из главных фишек PowerGUI — это Power Packs, готовые скрипты, опубликованные сообществом пользователей и выложенные в свободный доступ. Тут есть и простенькие команды вроде добавления пользователей, и сложные — к примеру, управление свитчами и виртуальными машинами. Все их легко дополнять и модифицировать в соответствии с нуждами.
powergui

PowerShell Studio 2015 фирмы Sapien — более продвинутая среда, которая рассчитана на совместную разработку одного проекта большим количеством участников. Если ты когда-нибудь имел дело с Visual Studio, то, думаю, заметишь сходство. Среди полезных фишек PowerShell Studio — панель Ribbon, поддержка удаленной отладки, а также функции компилятора, которые позволяют включить скрипты в исполняемые файлы. Есть поддержка разных версий PowerShell.
PowerShell Studio 2015

Стоит упомянуть и Script Browser для Windows PowerShell ISE. Это не среда разработки, но весьма интересный инструмент, разработанный в Microsoft. Script Browser открывает доступ к базе готовых скриптов, которые можно использовать в качестве образцов для написания своего кода. А еще эта штука умеет анализировать код, который ты пишешь, и подсказывает, как его улучшить.
Script Browser для Windows PowerShel
Удаленное управление с PowerShell
В основном описанные в статье команды выполняются на том же компьютере, на котором они запущены. Проще говоря, команды для управления AD выполнять нужно на сервере, где контроллер домена и установлен, что, согласиcь, на корню рубит удобство и автоматизацию. Для выполнения команд удалeнно, что нам и требуется, надо пользоваться специальными командлетами. К пpимеру, для подключения к удаленному компьютеру и перезапуску там спулера пeчати вводи
Enter-PSSession -ComputerName SRV4 Restart-Service -Name spooler
- Замена строк в файлах с использованием …
- Обработка ошибок в Powershell | SMEARG
- Это только мне кажется, или у …
Более подробно читай тут.
Объявление хеш-переменных
Чтобы использовать хеш-таблицу в программе, вы должны объявить переменную для ссылки на хеш-таблицу. Вот синтаксис для объявления хеш-таблицы переменных:
Синтаксис
$hash = @{ ID = 1; Shape = "Square"; Color = "Blue"} or $hash = @{}
Примечание. Упорядоченные словари могут быть созданы с использованием аналогичного синтаксиса. Упорядоченные словари поддерживают порядок добавления записей, а хеш-таблицы — нет.
пример
Следующие фрагменты кода являются примерами этого синтаксиса —
$hash = [ordered]@{ ID = 1; Shape = "Square"; Color = "Blue"}
Распечатать хеш-таблицу.
Выход
Name Value —- —— ID 1 Color Blue Shape Square
Доступ к значениям хеш-таблицы осуществляется через ключи .
> $hash["ID"] 1