2011-02-23 4 views
10

Quale funzione potrei utilizzare per trovare una posizione di carattere in una stringa utilizzando PowerShell 2.0.Trova posizione carattere e aggiorna nome file

io utilizzare CHARINDEX o PATINDEX se si utilizza SQL Server.

Ho cercato di utilizzare il cmdlet Select-String ma non sembra che faccia ciò che mi serve.

In definitiva, sto cercando un carattere "_" nel nome di un file e rimuovo tutto al seguente "." .

nome del file di esempio 237801_201011221155.xml

soluzione finale, il seguito strisce fuori tutti i caratteri da e compresa < _> per <.> Per tutti i file .xml nella directory corrente

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

Finirà con 237801.xml

+0

Si prega di consultare [ "domande dovrebbe includere‘tag’nei loro titoli? "] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è" no, non dovrebbero "! –

+0

@Andreas Niedermair questa domanda ha 4 anni! – Pixelated

+1

e sono ufficialmente un necromante :) –

risposta

28

La stringa è una stringa .NET che consente di utilizzare .NET me direzione tecnica. Nel tuo caso:

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

restituirà 3, che è la prima occorrenza di spazio nella stringa. Per maggiori informazioni consultare: http://msdn.microsoft.com/en-us/library/system.string.aspx

per il vostro bisogno provare qualcosa di simile:

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

Oppure si potrebbe usare espressioni regolari:

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

(deve essere regolata a seconda esattamente quello che ti serve).

+0

Vale anche la pena notare questa sintassi per una variabile: ad es. '$ percorso = get-location' ' "$ percorso" .IndexOf ("\") ' – testpattern

1

Se stai lavorando con file reali (al contrario di una sorta di dati di stringa), che ne dici di quanto segue?

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

(o utilizzare _.+$ se si vuole tagliare tutto ciò che dalla prima sottolineatura.)

+0

applausi per i suggerimenti. Aggiungerò il codice alla mia cassetta degli attrezzi Powershell, in continua crescita, – Pixelated

+0

Prego. Penso "Get-Childitem * .xml | Rename-Item -NewName {"$ ($ _. BaseName -replace '_ [^ _] + $', '') $ ($ _. Extension)"} 'è più facile all'occhio di .Substring/.IndexOf soluzione. – Bergius

0

Se si utilizza Excel, il comando sarebbe Trovare e MID. Ecco come apparirebbe in PowerShell.

$text = "asdfNAME=PC123456<>Diweursejsfdjiwr" 

asdfNAME = PC123456 <> Diweursejsfdjiwr - Randon riga di testo, vogliamo PC123456

$text.IndexOf("E=") 

- questo è il "Trova" di comando per Powershell

$text.substring(10,5) 

C1234 - questo è il comando "MID" per Powershell

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

PC123456 - Tada ha trovato e tagliare il nostro testo

-RavonTUS

2

Se si divide il nome del file su di sottolineatura e punto, ottieni una serie di 3 stringhe. Partecipa alla prima e la terza corda, cioè con indice 0 e 2

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

Un altro modo per fare la stessa cosa:

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

So che questa discussione è un po 'vecchio, ma, ero alla ricerca di qualcosa di simile e non riuscivo a trovarlo. Ecco cosa mi è venuto in mente. Creo un oggetto stringa utilizzando la classe String .Net per esporre tutti i metodi che normalmente si trovano se si utilizza C#

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

Risultato: 201011221155.xml