PowerShell Rename-Item SubString - PullRequest
       1

PowerShell Rename-Item SubString

0 голосов
/ 03 февраля 2019

У меня есть каталог файлов со следующим соглашением об именах: «### Bunch of random names.txt», и я хочу переименовать файлы в одно и то же без минусом «###».

Должно быть достаточно просто с:

Get-ChildItem -File | Rename-Item -newname { $_.Name.SubString(4,$_.Name.Length) }

Однако я получаю «Индекс и длина должны указывать на местоположение в строке.»

Я проверяю Name.Length с:

Get-ChildItem -File | select Name, @{ N='name length';E={$_.Name.Length) } }

$ _. Name.Length возвращает правильное значение int для каждого файла в каталоге

Когда я пытаюсь это сделать:

Get-ChildItem -File | select Name, @{N='name length';E={ $_.Name.SubString(4,$_.Name.Length) } }

Столбец «длина имени»пусто

Почему подстрока не похожа на $ _. Name.Length?Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

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

Get-ChildItem -File | ForEach-Object { $_ | Rename-Item -NewName $_.Name.SubString(4)}

Полученная ошибка "Index and length must refer to a location within the string." означает, что второй параметр (требуемая длина) превышает общую длину строки, поскольку вы обрезаете первые 4 символа.

$_.Name.SubString(4,$_.Name.Length - 4)

будет работать, но в этом случае это излишне.


РЕДАКТИРОВАТЬ

Учитывая комментарии ОП, я проверил еще несколько и действительно ... Кажется, есть проблема с передачей результатов из Get-ChildItemнепосредственно в командлет Rename-Item.(Я использую Powershell 5.1)

Кажется, вам нужно захватить элементы из командлета Get-ChildItem и выполнить итерацию этой захваченной коллекции, чтобы переименовать файлы.В противном случае некоторые файлы могут быть обработаны и переименованы несколько раз.

Вы можете сначала собрать коллекцию файлов в переменную, например, так:

$files = Get-ChildItem -File
foreach($file in $files) { $file | Rename-Item -NewName $file.Name.SubString(4)}

Или заключив в нее часть Get-ChildItemв скобках как PetSerAl предложил:

(Get-ChildItem -File) | Rename-Item -newname { $_.Name.SubString(4) }

Я нашел объяснение этому в этом ответе :

There appears to be a bug that can cause bulk file renaming to fail under certain conditions. If the files are renamed by piping a directory listing to Rename-Item, any file that's renamed to something that's alphabetically higher than its current name is reprocessed by its new name as it's encountered later in the directory listing.

0 голосов
/ 03 февраля 2019

еще одно решение, которое проверяет # каждое где

Get-ChildItem -Path E:\temp\*#*  | Rename-Item -NewName  { $_.fullname.replace('#','') }
0 голосов
/ 03 февраля 2019

Вместо использования SubString вы можете использовать Remove:

Get-ChildItem -File | Rename-Item -NewName { $_.Name.Remove(0,4) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...