Замена второго вхождения «-» на «_» с помощью Powershell

В админи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

Глядя на ваши примеры, кажется, что второй — всегда появляется между числами. Что-то вроде $Variable -replace ‘REGEX’,’_’

Читайте также:  Как дать права на DHCP сервер в Windows Server

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

(?<=[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 для начинающих.

Читайте также:  Установка и настройка System Center Configuration Manager 2012 r2

Выбираем среду разработки и инструменты

Теперь давай разберемся, где удобнее всего писать код. Можно, конечно, и в «Блокноте», 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.

Читайте также:  Буфер обмена Windows и сохранение его истории в Clipdiary

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

Более подробно читай тут.

Объявление хеш-переменных

Чтобы использовать хеш-таблицу в программе, вы должны объявить переменную для ссылки на хеш-таблицу. Вот синтаксис для объявления хеш-таблицы переменных:

Синтаксис

$hash = @{ ID = 1; Shape = "Square"; Color = "Blue"} or $hash = @{}

Примечание. Упорядоченные словари могут быть созданы с использованием аналогичного синтаксиса. Упорядоченные словари поддерживают порядок добавления записей, а хеш-таблицы — нет.

пример

Следующие фрагменты кода являются примерами этого синтаксиса —

$hash = [ordered]@{ ID = 1; Shape = "Square"; Color = "Blue"}

Распечатать хеш-таблицу.

$hash

Выход

Name Value —- —— ID 1 Color Blue Shape Square

Доступ к значениям хеш-таблицы осуществляется через ключи .

> $hash["ID"] 1