Найти положение персонажа и обновить имя файла - PullRequest
13 голосов
/ 23 февраля 2011

Какую функцию я могу использовать, чтобы найти позицию символа в строке, используя PowerShell 2.0.

Т.е. я бы использовал CHARINDEX или PATINDEX при использовании SQL Server.

Я смотрел на использование Select-String командлета, но, похоже, он не выполняет то, что мне нужно.

В конечном итоге я ищу символ «_» в имени файла и зачеркиваю все до следующего «.» ,

Пример имени файла 237801_201011221155.xml

Окончательное решение, ниже приведены все символы от <_> до <.> Включительно для всех .xml файлов в текущем каталоге

Get-Childitem *.xml | Rename-Item -newname `
  { $_.name -replace $_.name.SubString($_.name.IndexOf("_"), `
       $_.name.LastIndexOf(".") - $_.name.IndexOf("_") ),''}

В итоге получится 237801.xml

Ответы [ 5 ]

34 голосов
/ 23 февраля 2011

Строка является строкой .NET, поэтому вы можете использовать методы .NET.В вашем случае:

$index = "The string".IndexOf(" ")

вернет 3, что является первым появлением пробела в строке.Для получения дополнительной информации см .: http://msdn.microsoft.com/en-us/library/system.string.aspx

. Для ваших нужд попробуйте что-то вроде:

$s.SubString($s.IndexOf("_") + 1, $s.LastIndexOf(".") - $s.IndexOf("_") - 1)

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

if ($s -Match '(_)(.*)(\.)[^.]*$') {  $matches[2] }

(необходимо настроитьв зависимости от того, что именно вам нужно).

2 голосов
/ 29 декабря 2015

Если вы разделите имя файла на подчеркивание и точку, вы получите массив из 3 строк.Соедините первую и третью строки, то есть с индексами 0 и 2

$x = '237801_201011221155.xml' 
( $x.split('_.')[0] , $x.split('_.')[2] ) -join '.' 

Еще один способ сделать то же самое:

'237801_201011221155.xml'.split('_.')[0,2] -join '.'
1 голос
/ 21 ноября 2014

Если вы используете Excel, то команда будет Find и MID. Вот как это будет выглядеть в Powershell.

 $text = "asdfNAME=PC123456<>Diweursejsfdjiwr"

asdfNAME = PC123456 <> Diweursejsfdjiwr - строка текста Randon, нам нужно PC123456

 $text.IndexOf("E=")

7 - это команда «НАЙТИ» для Powershell

 $text.substring(10,5)

C1234 - это команда «MID» для Powershell

 $text.substring($text.IndexOf("E=")+2,8)

PC123456 - Тада нашла и отрезала наш текст

-RavonTUS

1 голос
/ 23 февраля 2011

Если вы работаете с реальными файлами (в отличие от каких-либо строковых данных), как насчет следующего?

$files | % { "$($_.BaseName -replace '_[^_]+$','')$($_.Extension)" }

(или используйте _.+$, если вы хотите вырезать все из первого подчеркивания.)

0 голосов
/ 28 апреля 2016

Я знаю, что эта ветка немного старая, но я искал что-то похожее и не смог ее найти. Вот что я придумал. Я создаю строковый объект, используя класс .Net String, чтобы показать все методы, обычно встречающиеся при использовании C #

[System.String]$myString
 $myString = "237801_201011221155.xml"
 $startPos = $myString.LastIndexOf("_") + 1 # Do not include the "_" character
 $subString = $myString.Substring($startPos,$myString.Length - $startPos)

Результат: 201011221155.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...