2011-02-23 20 views
10

PowerShell 2.0 kullanan bir dizede bir karakter konumunu bulmak için hangi işlevi kullanabilirim? SQL Server kullanıyorsanız, CHARINDEX veya PATINDEX kullanırım.Karakter konumunu bulma ve dosya adını güncelleme

Select-String cmdlet'ini kullanarak baktım ama yapmam gerekeni yapıyor gibi görünmüyor.

Nihayetinde bir dosya adında "_" karakterini bulmak ve herşeyi aşağıdaki gibi çözmek için arıyorum. " .

Örnek dosya adı 237801_201011221155.xml

Nihai Çözüm, aşağıdan tüm karakterleri çıkarır ve < için < _> dahil.> Tüm .xml dosyaları için geçerli dizinde

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

237801.xml ile sonlandırılacaktır

+0

Lütfen bakınız [başlıklarında etiketleri ‘" Meli sorular şunlardır’? "] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), burada fikir birliği" hayır, yapılmamalıdır "! –

+0

@Andreas Niedermair bu soru 4 yaşında! – Pixelated

+1

ve resmen bir necromancer :) –

cevap

28

Dize bir .NET dizesidir, böylece .NET beni kullanabilirsiniz için metotlar. Sizin durumunuzda, dizedeki ilk boşluk olan 3'ü döndürecektir. gibi bir şey deneyin ihtiyacı için http://msdn.microsoft.com/en-us/library/system.string.aspx

: Daha fazla bilgi için bkz

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

Yoksa İfadelerinin kullanabilirsiniz:

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

(tam olarak neye ihtiyacınız bağlı olarak ayarlanması gerekir).

+0

Ayrıca bu sözdizimini bir değişken için not etmeye değer: ör. '$ path = get-location' ' "$ yol" .IndexOf ("\") ' – testpattern

1

Gerçek dosyalarla çalışıyorsanız (bir çeşit dize verilerinin tersine), aşağıdakilere ne dersiniz? Excel kullanıyorsanız

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

(veya ilk alt çizgi her şeyi kesmek istiyorsanız _.+$ kullanın.)

+0

önerilere şerefe. Kodumu sürekli büyüyen Powershell araç kutusuna ekleyeceğim – Pixelated

+0

Bir şey değil. Bence-Childitem * .xml | Rename-Item -NewName {"$ ($ _. BaseName -replace '_ [^ _] + $', '') $ ($ _. Extension)"} ', göze daha kolay .Substring/.IndexOf çözüm. – Bergius

0

ardından komut bulun ve MID olurdu. İşte Powershell'de nasıl görüneceği.

$text = "asdfNAME=PC123456<>Diweursejsfdjiwr" 

asdfNAME = PC123456 <> Diweursejsfdjiwr - Randon metnin satır, istediğimiz PC123456

$text.IndexOf("E=") 

- Bu

$text.substring(10,5) 
Powershell

için komutu "BUL" dir

C1234 - Bu Powershell

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

PC123456 için "MID" komutu - Tada o bulunmazsa ve alt çizgi üzerinde dosya adı bölerseniz

eden metin -RavonTUS

2

kesti ve nokta, 3 dizeleri bir dizi olsun. indeksi 0 ve 2

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

ile aynı şeyi yapmak için başka bir yol, yani birinci ve üçüncü dize Üyelik:

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

Ben Konuyu biraz eski olduğunu biliyorum ama, ben bir şey arıyordu benzer ve bulamadık. İşte neyle geldiğini. C#

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

Sonucu kullanılıyorsa normalde bulunan tüm yöntemleri açığa Net dize sınıfını kullanarak bir dize nesne oluşturmak: 201011221155.xml

İlgili konular