/ / Знайти позицію символу та ім'я файлу оновлення - powershell, powershell-v2.0

Знайти розташування символів і ім'я файлу оновлення - powershell, powershell-v2.0

Яку функцію я можу використовувати, щоб знайти позицію символу в рядку за допомогою PowerShell 2.0.

тобто я б використовував CHARINDEX або PATINDEX, якщо використовую SQL Server.

Я подивився на використання Select-String cmdlet, але вона, здається, не робить того, що мені потрібно.

Зрештою, я шукаю символ "_" у назві файлу і зняти все з наступного ".".

Приклад імені файлу 237801_201011221155.xml

Остаточне рішення. Нижче наведено всі символи від <_> до <.> Для всіх .xml-файлів у поточному каталозі

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

Буде закінчуватися 237801.xml

Відповіді:

32 за відповідь № 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 для відповіді № 2

Якщо ви розділите ім'я файлу на підкреслення та крапку, ви отримаєте масив з 3 рядків. Приєднують перший і третій рядок, тобто з індексом 0 і 2

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

Інший спосіб зробити те ж саме:

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

1 для відповіді № 3

Якщо ви працюєте з фактичними файлами (на відміну від деяких типів рядкових даних), як щодо наступного?

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

(або використовувати _.+$ якщо потрібно вирізати все з першого підкреслення.)


1 для відповіді № 4

Якщо ви використовуєте Excel, то командою буде Find і MID. Ось як це буде виглядати в Powershell.

 $text = "asdfNAME=PC123456<>Diweursejsfdjiwr"

asdfNAME =PC123456<> Diweursejsfdjiwr - Рендон рядку тексту, ми хочемо PC123456

 $text.IndexOf("E=")

7 - це команда "FIND" для Powershell

 $text.substring(10,5)

C1234 - це команда "MID" для Powershell

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

PC123456 - тоді він знайшов і розрізав наш текст

-RavonTUS


0 для відповіді № 5

Я знаю, що цей потік старий, але я бувшукали щось подібне і не могли його знайти. Ось що я придумав. Створюю строковий об'єкт, використовуючи клас .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