Найти расположение символа и имя файла обновления

Какую функцию я могу использовать для поиска позиции символа в строке с помощью PowerShell 2.0.

i.e Я бы использовал 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

Ответ 1

Строка представляет собой строку .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

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

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

Другой способ сделать то же самое:

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

Ответ 3

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

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

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

Ответ 4

Если вы используете 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

Ответ 5

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

[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