Удалить первые символы в названии файлов powershell
У меня есть большая библиотека документов, хранящаяся на сервере Sharepoint, который был перенесен из старой базы данных Access, управление версиями этих документов осуществлялось пользователем и добавлялось в конце имени файла при внесении изменений.
- Doc1-тест (1,0).doc
- Doc1-тест (1.1).doc
- Doc2-пример (2.1).doc
- Doc2-пример (2.2).doc
Сейчас мы используем Sharepoint для управления версиями, и нам нужно удалить версию, указанную в имени файла.
У меня был умеренный успех со следующим сценарием;
но я не могу заставить его удалить скобки из имени файла. Таким образом, в моем каталоге тестирования файлы изменились на следующие
Doc1-doc(1.0).doc ----- Doc1-doc(). Doc
Числа варьируются от 1,0 до 4,5, и существует более 1200 документов, поэтому я не против использовать индивидуальный сценарий для каждого номера версии.
2 ответа 2
Проблема, с которой вы сталкиваетесь, заключается в том, что -replace PowerShell использует регулярные выражения для поиска.
Это означает, что скобки ( () ) в вашем поисковом запросе интерпретируются как группа захвата RegEx.
В этом случае вы хотите ссылаться на них как на буквальные символы, поэтому вам нужно выйти за скобки. В RegEx это делается с помощью обратной косой черты ( \ ).
Поэтому -replace '\(1.0\)','' должен это сделать.
Поскольку вы используете RegEx, вы можете воспользоваться этим и сделать их все сразу, указав в качестве шаблона поиска класс символов "число" или "набор" символов вместо реальных номеров версий.
Так что-то вроде:
Если вы хотите удалить квадратные скобки и все, что между ними, вы можете использовать шаблон RegEx «любой символ ( . ) Любое количество раз ( * )»:
Примечание: RegEx может вас удивить (в этом случае представьте внешние и внутренние скобки в одном имени файла), поэтому сделайте резервные копии ваших файлов и сначала запустите тесты. :)
но я не могу заставить его удалить скобки из имени файла. Таким образом, в моем каталоге тестирования файлы изменились на следующие
Doc1-doc(1.0).doc ----- Doc1-doc(). Doc
Это потому, что replace использует регулярное выражение и скобки (группа захвата) должны быть экранированы. Самый простой способ избежать всего текста - использовать метод [regex]::Escape :
Обратите внимание, что простое удаление всего в скобках создаст конфликты для файлов, таких как Doc1-test(1.1).doc и Doc1-test(1.0).doc - они оба будут сопоставлены с Doc1-test.doc .
Вот моя версия с регулярным выражением, которая будет совпадать только с разделенными точками цифрами в скобках в конце имени файла без расширения. Я не обрабатываю конфликты имен файлов в этом коде, потому что я не знаю желаемого результата.
Передо мной была поставлена задача создать хранилище файлов, удалить лишние символы мусора из имени файла и сохранить переименованный файл в другой папке.
Пример имен файлов:
Первая группа чисел в начале - это идентификаторы записей, которые необходимо сохранить вместе с расширением файла. Все остальное между идентификаторами записей и расширением файла необходимо удалить.
Например, окончательное имя для первых трех файлов будет:
Я прочитал удаление символов и Перемещение имен файлов в дополнение к другим публикациям, но сложность наличия переменной длины символа в фронт, переменное количество промежуточных символов, которые нужно удалить, и переменные типы расширений файлов действительно бросили это за пределы моего ограниченного охвата PowerShell.
4 ответа
Другой подход без регулярного выражения. В обоих следующих примерах используется параметр снижения риска -WhatIf для целей отладки.
Переименовать и переместить файлы:
Я знаю, что это не PowerShell. Если вы просто хотите, чтобы что-то работало, это командный файл cmd.
Вероятно, наиболее идиоматический способ решения этой проблемы заключается в следующем (предполагается, что все файлы, представляющие интерес - и никакие другие - находятся в текущем каталоге.):
Добавьте общий параметр -WhatIf в команду Rename-Item для предварительного просмотра операции переименования.
Обратите внимание, что Rename-Item всегда переименовывает элементы в их текущем местоположении; чтобы (также) переместить их, используйте Move-Item .
Если цель с таким именем уже существует, Rename-Item сообщает о непрекращающейся ошибке для каждого такого случая (без прерывания общей обработки).
Обратите внимание, что его также может произойти, если имя входного файла не содержит - , так как это приведет к попытке переименовать файл для себя.
Get-ChildItem -File выводит [System.IO.FileInfo] объекты, представляющие файлы в текущем каталоге, которые передаются по конвейеру ( | ) в Rename-Item .
Передача блока скрипта ( < . >) параметру Rename-Item -NewName выполняет содержащийся код для каждого входного объекта, где $_ представляет входной объект под рукой.
- Обратите внимание, что этот практически недокументированный, но часто используемый метод называется параметром блока сценария [значение], где параметр, предназначенный для ввода данных в конвейер, может быть связан с блоком сценария, который обрабатывает ввод косвенным образом.
($_.BaseName -split '-')[0] извлекает 1-й - - разделенный токен из базового имени каждого входного имени файла (имя файла без расширения).
+ , поскольку LHS является строкой, выполняет конкатенацию string .
$_.Extension извлекает расширение имени файла из каждого входного имени файла.
Вы можете использовать > оператор для выполнения этой операции со строками:
Регулярное выражение является уловкой здесь:
- (8+) означает соответствие серии цифр (1 или более цифр)
- .* означает совпадать с чем угодно
- (\.[^.]*) означает совпадение с точкой, за которой следуют любые символы, кроме точки
- $ означает, что совпадение должно доходить до конца строки
Первая и третья особенность заключаются в том, что они заключены в круглые скобки, что означает, что вы можете использовать эти значения, используя долларовую нотацию (например, $1 ) в строке замены.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Тогда самый простой способ: Код: Выделить весь код PS E:\> $username -replace 'regions\\', '' i2803-04-113 i2803-04-126 i2803-04-156 Этот же прием работает, если переменная является массивом строк, например. » |
Спасибо очень выручил. А у мну не получалось потому-что я вводил: $username -replace "regions\" .
Мне бы ещё убрать лишнее со строковой переменной.
DisplayName
----------------
Петров Пётр Петрович
Ещё раз спасибо!
Последний раз редактировалось Luka666, 11-07-2016 в 15:04 .
Так как я не в курсе как именуется у Вас переменная на сей раз, а также действительно ли переменная хранит строку, а не какой иной объект, можно поступить так:
$a - переменная, в которой хранится строка, т.е. при попытке узнать тип переменной в хост будет возвращено следующее:
С помощью типа Regex находим индекс первого кириллического символа в строке, а далее методом Substring извлекаем нужную нам подстроку. Можно, конечно, сделать проще, но, повторяюсь, не в курсе, что действительно у Вас за переменная.
Произошла ошибка при вызове метода, так как [Selected.Microsoft.ActiveDirectory.Management.ADUser] не с
одержит метод с именем "Substring".
строка:1 знак:21
+ $username2.Substring ').Index), $username2.length
- $$)
+ CategoryInfo : InvalidOperation: (Substring:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
У меня переменная получается путём извлечения из AD нужного объекта:
$username = $username -REPLACE 'REGIONS\\', ''
$username2 = get-aduser $username -Properties displayname|select-object DisplayName
т.е извлечения полного выводимого имени из юзерской учётки в AD. Для того, чтоб вставить его в описание учётной записи компьютора на котором этот юзер залогинен в данный момент.
Set-ADComputer $computer -Description "$username2"
Но так, как переменная $username2 содержит запись в виде строки:
DisplayName
----------------
Петров Пётр Петрович
В описание учётки рабочей станции записывается: @
А мне надо только " Петров Пётр Петрович " (без кавычек). Для этого полагаю что в переменной $username2 текст должен быть такой-же "чистый" в виде текста, безо всего лишнего.
У меня есть большое количество файлов в каталоге с этим типом соглашения об именах: “1050_14447_Letter Extension.pdf” и т.д. Мне нужно удалить все символы перед вторым подчеркиванием (включая 2-е подчеркивание). Таким образом, новым именем файла будет “Letter Extension.pdf”. Как я могу переименовать переименование одного каталога соответственно?
Вот пример, чтобы переименовать все файлы PDF в текущем каталоге, удалив все ведущие числа или символы подчеркивания из имени файла:
Здесь другой метод, который не полагается на регулярное выражение, но не принимает никаких подчеркиваний в пути к файлу:
Для строки типа “1050_14447_Letter Extension.pdf”, это один из способов:
Это будет обрабатывать любое количество символов подчеркивания в имени файла (игнорируя путь) и пропускать все до и включая последний символ подчеркивания при генерации нового имени: –
Вы можете протестировать, используя переключатель -whatif в команде rename-item, например,
Что делать: Выполнение операции “Переименовать файл” на целевом элементе: R:\TECH\38415_JOBS121121155535240.pdf Destin
at: R:\TECH\JOBS121121155535240.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\CHG38415_JOB_121112153717550.pdf Des
t: R:\TECH\121112153717550.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\CHG38415_PREH_121113152548740.pdf De
stination: R:\TECH\121113152548740.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\CHG38415_PREI_121113152600640.pdf De
stination: R:\TECH\121113152600640.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\MCPTEST121125121201390.pdf Destinati
на: R:\TECH\MCPTEST121125121201390.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\PREHAND_38415_121121154127000.pdf De
stination: R:\TECH\121121154127000.pdf “.
Что делать, если: Выполнение операции “Переименовать файл” в Target “Пункт: R:\TECH\PREIMP_38415_121121154140630.pdf Des
t: R:\TECH\121121154140630.pdf “.
Вот еще один способ использования автоматических инструментов StringSolver. После установки команда mv дополняется полуавтоматическими процедурами принятия решений.
Сначала вы должны сделать следующее:
Тогда вы спросите, каково будет обобщенное преобразование:
Он сказал бы вам что-то вроде “
объединяет имя файла и его расширение, начиная с первого слова, разделенного символом ‘.’
который еще не совсем то, что вы хотите. Вам нужно дать другой пример, например:
имя файла, начинающееся после второй ‘_’ + константной строки ‘.’ + расширение
Итак, теперь вы можете сделать:
И он выполнит преобразование.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я являюсь соавтором этой работы в академических целях. Другие примеры доступны на youtube.
В статье я покажу вам 3 способа переименования нескольких файлов, включая изменение расширения, без использования сторонних программ.
Как переименовать несколько файлов с помощью проводника
Вы можете выбрать один из нескольких методов переименования файлов. Но, обычному пользователю, я рекомендую использовать проводник Windows 10.
Переименование нескольких файлов по одному
Чтобы переименовать несколько файлов с различными именами с помощью клавиши «Tab», выполните следующие действия:
Шаг 1: Откройте проводник.
Шаг 2: Откройте папку с файлами, которую хотите переименовать.
Шаг 3: Перейдите на вкладку «Вид».
Шаг 4: Выберите «Таблица».
Шаг 5: Выберите первый файл в папке.
Шаг 6: Перейдите на вкладку «Главная».
Есть и другие способы переименовать файл в проводнике Windows:
- Выберите необходимый файл и нажмите клавишу «F2».
- Нажмите мышки по необходимому файлу и в выпадающем меню выберите пункт «Переименовать»
- Кликните по названию файла левой кнопкой мышки и снова но уже медленнее клинките по нему.
Шаг 8: Введите новое имя файла.
Шаг 9: Нажмите клавишу «Tab», чтобы перейти к переименованию следующего файла в списке.
Шаг 10: Введите новое имя файла.
Шаг 11: Нажмите клавишу «Tab» еще раз, чтобы перейти к следующему файлу.
Переименование нескольких файлов одновременно
Чтобы переименовать несколько файлов с одинаковой структурой имен, выполните следующие действия:
Шаг 1: Откройте проводник.
Шаг 2: Найдите папку с файлами для переименования.
Шаг 3: Перейдите на вкладку «Вид».
Шаг 4: Выберите «Таблица».
Шаг 5: Перейдите на вкладку «Главная».
Вы также можете использовать сочетание клавиш «Ctrl + A» для быстрого выбора всех файлов. Вы можете нажать и удерживать клавишу «Ctrl», а затем выбрать необходимые файлы кликнув по каждому. Вы также можете выбрать первый файл, нажать и удерживать клавишу «Shift, а затем кликнуть по последнему, чтобы выбрать группу файлов.
Шаг 8: Введите новое имя файла и нажмите Enter.
После выполнения всех шагов все выбранные файлы будут переименованы по той же схеме. Но, к ним был добавлен порядковый номер (число в скобках). Например, летние _каникулы_2019 (1).jpg и летние_каникулы_2019 (2).jpg.
Если вы допустили ошибку, вы можете использовать сочетание клавиш «Ctrl + Z», чтобы отменить переименование. Тоже самое можно сделать нажав на кнопку меню в верхнем левом углу (в строке заголовка Проводника) и выбрав опцию «Отменить».
Как переименовать несколько файлов с помощью командной строки
Если вам удобнее использовать команды, можете использовать командную строку, чтобы изменить имя одного или нескольких файлов.
Переименование одного файла в командной строке
Чтобы переименовать один файл с помощью командной строки, выполните следующие действия:
Шаг 1: Откройте меню Пуск.
Шаг 2: Откройте командную строку.
Шаг 3: Перейдите к папку с файлами. В моем примере я буду работать в папке «Документы»:
Читайте также: