Удалить первые символы в названии файлов powershell

Обновлено: 04.07.2024

Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. В этой статье описывается выполнение конкретных задач по управлению файлами и папками с помощью PowerShell.

Получение списка файлов и папок, содержащихся в папке

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem . Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse . (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object .

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Копирование файлов и папок

Копирование выполняется с помощью командлета Copy-Item . Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:

Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.

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

Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке C:\data , в папку C:\temp\text :

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:\boot.ini в файле C:\boot.bak :

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку C:\temp\New Folder :

Эта команда создает пустой файл C:\temp\New Folder\file.txt .

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета Remove-Item , однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки C:\temp\DeleteMe , которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse:

Подключение локальной папки как диска

Отобразить локальную папку можно с помощью команды New-PSDrive . Следующая команда создает локальный диск P: , корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist . Но с этим параметром можно использовать только удаленные пути.

Чтение текстового файла в массив

Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле C:\temp\domainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Вы можете использовать командлет Get-Content , чтобы извлечь содержимое файла и поместить его в переменную $Computers :

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.

Как удалить определенные символы или заменить некоторые символы другими символами с помощью выполнения пакетного файла, для имен файлов всех файлов в папке Windows на одном дыхании, Есть ли команда DOS для этого?

используйте PowerShell, чтобы сделать что-нибудь умнее для приглашения DOS. Здесь я показал, как пакетно переименовать все файлы и каталоги в текущем каталоге, содержащие пробелы, заменив их на _ подчеркивания.

EDIT:
дополнительно the Where-Object команда может использоваться для фильтр из недопустимых объектов для последовательных (command-let). Ниже приведены некоторые примеры, иллюстрирующие гибкость, которую он может себе позволить:

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

для обработки только каталогов (до версии 3.0)

PowerShell версии 3.0 введена новая Dir флаги. Вы также можете использовать Dir -Directory там.

пропустить все файлы, уже содержащие символ подчеркивания (или какой-либо другой символ)

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

ответы PowerShell хороши, но команда Rename-Item не работает в одном целевом каталоге, если все ваши файлы не имеют нежелательного символа в них (сбой, если он находит дубликаты).

Если вы похожи на меня и имели смесь хороших и плохих имен, попробуйте этот скрипт вместо этого (заменит пробелы подчеркиванием):

этот файл может помочь, но он имеет некоторые ограничения. Символы имени файла = и % не могут быть заменены (переход из памяти здесь), и ^ в именах файлов также может быть проблемой.

в этой части %newname: =_% в каждой строке нижнего блока он заменяет символ после : с персонажем после = так как он стоит, куча символов будет заменена подчеркиванием.

удалить echo для активации команды ren как это просто печатать команды в окне консоли, пока вы делаете.

он будет обрабатывать только текущую папку, если вы не добавите /s к части команды DIR, а затем он будет обрабатывать все папки под текущим тоже.

чтобы удалить определенный символ, удалите символ после знака=. В %newname:z=% такая запись удалит все символы z (без учета регистра).

Я бы рекомендовал для этого. Тип ren /? в командной строке для получения дополнительной помощи.

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

Квантификаторы

Даже для трех символов это выглядит неаккуратно и громоздко, однако данную конструкцию можно значительно сократить. Для этого в регулярных выражениях существуют специальные количественные модификаторы (квантификаторы). Квантификатор ставится справа от символа (или класса) и указывает их необходимое количество. Например квантификатор означает 3 символа, соответственно предыдущий пример с использованием квантификаторов будет выглядеть так:

использование квантификаторов

квантификаторы, min и max

Максимальное значение можно опустить, задав только минимальное, например означает ″3 и более символов″. Для наиболее общих квантификаторов есть сокращенное написание:

любое количество любых символов

И еще, стоит помнить о необязательности квантификаторов, у которых в качестве минимального значения стоит ноль (напр. ? и *). Это значит, что регулярные выражения с их использованием для положительного результата не нуждаются хотя-бы в одном совпадении, они совпадают даже при отсутствии символов. Например выражения ″.?″ , ″.*″ или ″[a-z]*″ совпадают с чем угодно, включая пустую строку.

необязательные квантификаторы

Операторы replace и split

Работа с регулярными выражениями может включать в себя не только поиск, но и обработку найденного. Для этих целей в PowerShell имеются операторы replace и split, которые могут не только анализировать строки, но и производить в них некоторые изменения.

Оператор replace находит часть строки, подходящую под регулярное выражение, и заменяет ее. Для примера запросим список файлов в директории и поместим его в переменную, а затем выведем имя одного из файлов:

$files = Get-ChildItem C:\Files\PS Books
$files[1].Name

А теперь возьмем полученное имя и поменяем в нем ″ PowerShell ″ на ″ CMD ″ :

$files[1].Name -replace ″PowerShell″, ″CMD″

Еще одна особенность replace в том, что можно не указывать строку замены. В этом случае будет произведена замена найденного объекта на пустое место, или попросту удаление. Например так мы удалим слово ″ PowerShell ″ из названия файла:

$files[1].Name -replace ″PowerShell″

оператор replace

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

$files[1].Name -split ″\s″

При необходимости через запятую можно указать максимальное количество частей, на которые можно разбить строку:

$files[1].Name -split ″\s″, 2

оператор split

Примечание. Так же как и match, операторы replace и split не зависят от регистра символов. Для этого у них имеются регистрозависимые версии creplace и csplit.

Лень и жадность

″Greedy and Lazy Quantifiers″ -replace ″L.*″

Как видите, в данном случае квантификатор * отработал максимуму, захватив часть строки Lazy Quantifiers, т.е. все что следует после L и до конца строки. Поскольку такой подход не всегда приемлем, существует возможность ограничить квантификатор необходимым минимумом. Для этого есть ″ленивые″ версии квантификаторов, получаемые с помощью добавления вопросительного знака, напр. *?, +?, ??, ?. Немного изменим предыдущую команду:

″Greedy and Lazy Quantifiers″ -replace ″L.*?″

″Greedy and Lazy Quantifiers″ -replace ″L.*?\s″

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

ленивые и жадные квантификатор

Захватывающие группы

С помощью круглых скобок символы в регулярных выражениях можно объединять в группы. Группы можно использовать для упорядочения и группировки, к ним можно применять квантификаторы, например:

″Test grouping in regular expressions.″ -match ″(\w+\s)(\w+)\.$″

″Test grouping in regular expressions.″ -match ″(\w+)\s(\w+)\.$″

Это позволяет не просто найти, но и извлечь полученный результат.

пример группировки в регулярных выражениях

Группы могут быть вложенными одна в другую, например так:

″Test grouping in regular expressions.″ -match ″((\w+)\s(\w+))\.$″

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

вложенные группы

Обращаться к именованным группам можно как по их номеру, так и по имени, например:

именованные группы

Обратные ссылки

Еще одной особенностью групп является то, что внутри регулярного выражения на них можно ссылаться с помощью конструкций, называемых обратными ссылками (backreference). В некоторых случаях это очень удобно, например для поиска повторяющихся элементов в строке. Ссылаться на неименованные группы можно с помощью конструкции \n, где n является порядковым номером группы в регулярном выражении. Для примера найдем повторяющиеся слова в строке:

″Test grouping in regular regular expressions.″ -match ″(\w+)\s(\1)″

Здесь в первую группу попадает слово regular, ссылка на которое (\1) затем используется во второй группе.

обратные ссылки

Поскольку подобная запись используется не только в обратных ссылках, но и для обозначения восьмеричных escape-кодов, то существуют следующие правила:

• Выражения от \1 до \9 всегда интерпретируются как обратные ссылки, а не как восьмеричные числа;
• Выражения от \10 и больше считаются обратными ссылками в том случае, если имеется обратная ссылка, соответствующая данному номеру. В противном случае выражение интерпретируется как восьмеричный код;
• Если первая цифра многоразрядного выражения 8 или 9 (напр. \85), то выражение интерпретируется как литерал.

″Test grouping in regular regular expressions.″ -match ″(?<first>\w+)\s(\k<first>)″

обратные ссылки к именованным группам

Незахватывающие группы

При использовании захватывающих групп на сохранение их содержимого тратится дополнительное время и ресурсы, что при обработке больших объемов данных может отрицательно сказаться на производительности. Поэтому, если группы нужны исключительно для группировки символов, а в захвате нет необходимости, то можно использовать ″незахватывающие″ группы. Эти группы получаются с помощью переключателя (?: ), например:

″Test grouping in regular expressions.″ -match ″(?:\w+\s)(\w+)\.$″

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

незахватывающие группы

Практический пример

$file = Get-Content C:\Files\err.log
$file[5]

Как видите, в строке идет имя сайта, а сразу за ним код ответа сервера. Выведем необходимую информацию такой командой:

пример парсинга логов

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

2.jpg
2.jpg
2.jpg
4.jpg
7.jpg
4.jpg
7.jpg

Использование Powershell для удаления файлов

Звезда активна
Звезда активна
Звезда активна
Звезда активна
Звезда не активна

Использование Powershell для удаления файлов

Использование PowerShell commnads для удаления файла

Можно также использовать символ '*' символы, чтобы удалить несколько элементов.

Например, эта команда удаляет все файлы в каталоге C: \ тест: с расширением .txt .

Здесь же вы можете использовать -Force команду, чтобы удалить все файлы из каталога -Force

Здесь же вы можете использовать -Force команду, чтобы удалить все файлы и папки -recurse

Из-за сильной занятости на работе в последнее время не получается уделять время блогу. Но сегодня выкроил немного времени и решил рассказать одну, на мой взгляд, интересную тему, которую каждый решает по-своему и не всегда очень удобным способом (о чём свидетельствует книга по PowerShell и ньюсгруппы). И на это есть весомые причины. А так же расскажу о весьма странном поведении ряда командлетов (на примере Get-Acl) при работе с файлами.

Давайте рассмотрим вопрос с начала и выйдем на нашу проблему. При поиске группы файлов PowerShell, как и многие другие командные оболочки, позволяет создавать маску поиска, как "*", "?". Безусловно с ними проблем быть не может, т.к. эти знаки в именах файлов встречаться не могут. Но если в имени файла используется символ открывающейся или закрывающейся квадратной скобки - "[" и "]", соответственно. Данные символы допустимы для именования файлов, но интерпретатор PowerShell их воспринимает как мета-символы подстановочного шаблона/маски, например:

[a-z]* - все объекты, которые начинаются с букв латинского алфавита
*2 - все объекты, которые заканчиваются любой цифрой и т.д.

При этом встаёт вопрос, как сказать интерпретатору, что квадратная скобка в данном случае является литералом, а не мета-символ? Для начала я в папке создал 3 файла, 2 из которых содержат квадратные скобки:

Давайте просмотрим содержимое файла text[text.txt:

занятно, не правда ли? Здесь мы столкнулись с проблемой, что интерпретатор PowerShell воспринял скобку в имени файла за мета-символ. Бороться с этим можно различными методами. Как вариант - использовать параметр -LiteralPath, что будет говорить интерпретатору о буквальном чтении пути. Проверим:

Как видите, мы получили содержимое файла (там отрывок из дисклаймера Quest Software). Однако, параметром -LiteralPath обладают далеко не все командлеты. Например, Get-Acl. У него нету такого параметра, поэтому получить ACL список такого файла будет очень проблематично. Посмотрим пример:

Get-Item спокойно работает с LiteralPath, но при передаче его по конвейеру в командлет Get-Acl мы получаем ошибку. Хотя, по идее это должно было сработать. Кстати говоря, это первый обнаруженный недостаток. Вместо LiteralPath можно использовать 4 backtick (text````[text.txt), либо проще (что мне показалось более очевидным) - поместить литеральную скобку в подстановочный шаблон:

В первом примере я использовал рецепт из книги Windows PowerShell In Action (страница 310), второй я додумал сам. Однако, оба эти приёма заменяют параметр -LiteralPath, но так же не решают проблемы командлетов, как Get-Acl. Если передавать эти объекты в Gat-Acl, то всё равно мы будем получать ошибки. Как вариант решения - использование промежуточной функции-фильтра (это рецепт решения Kiron из ньюсгрупп):

При использовании фильтра наш литеральный символ заменяем подстановочным знаком "?", пропускаем через фильтр и подаём на командлет Get-Acl:

Так оно работает. В качестве первого предположения я подумал на тип объектов:

Что при Get-Item мы получаем тип объектов FileInfo, который не содержит ACL, поэтому данный командлет передаёт в конвейер свойство PsPath, который уже Get-Acl использует для повторного извлечения уже ACL объекта.

Однако, я обратил внимание, что при использовании UNC путей вместо локальных промежуточная функция не требуется и вполне работает подстановочная маска заключённая в квадратные скобки:

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

Желающие могут перейти по ссылке и подтвердить данную ошибку. Всем спасибо за участие :)

Читайте также: