2011-02-23 17 views
10

¿Qué función podría usar para encontrar una posición del carácter en una cadena usando PowerShell 2.0.Buscar la posición del carácter y actualizar el nombre del archivo

es decir, usaría CHARINDEX o PATINDEX si usa SQL Server.

Miré usando el cmdlet Select-String pero parece que no hago lo que necesito hacer.

En definitiva, estoy buscando un carácter "_" en un nombre de archivo y despojarlo todo de lo siguiente "." .

Ejemplo Nombre del archivo 237801_201011221155.xml

Solución Final, A continuación se estropea todos los caracteres desde e incluyendo < _> a <.> Para todos los archivos .xml en el directorio actual

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

Terminará con 237801.xml

+0

Por favor, véase [ "preguntas debe incluir‘etiquetas’en sus títulos? "] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), donde el consenso es" no, no deberían ". –

+0

@Andreas Niedermair ¡esta pregunta tiene 4 años! – Pixelated

+1

y soy oficialmente un nigromante :) –

Respuesta

28

La cadena es una cadena .NET para que pueda usar .NET me thods. En su caso:

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

devolverá 3, que es la primera aparición de espacio en la cadena. Para obtener más información, véase: http://msdn.microsoft.com/en-us/library/system.string.aspx

para sus necesidades intentar algo como:

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

O usted podría utilizar expresiones regulares:

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

(tiene que ser ajustado dependiendo exactamente lo que necesita).

+0

También vale la pena señalar esta sintaxis para una varible: p. '$ path = get-location' ' "$ ruta" .IndexOf ("\") ' – testpattern

1

Si está trabajando con archivos reales (a diferencia de algún tipo de datos de cadena), ¿qué tal lo siguiente?

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

(o utilizar _.+$ si se quiere cortar todo, desde el primer subrayado.)

+0

aplausos por las sugerencias. Agregaré el código a mi creciente caja de herramientas Powershell – Pixelated

+0

De nada. Creo que 'Get-Childitem * .xml | Rename-Item -NewName {"$ ($ _. BaseName -replace '_ [^ _] + $', '') $ ($ _. Extension)"} 'es más fácil de ver que .Substring/.IndexOf solución. – Bergius

0

Si utiliza Excel, a continuación, el comando sería tan fácil encontrar y MID. Esto es lo que se vería en Powershell.

$text = "asdfNAME=PC123456<>Diweursejsfdjiwr" 

asdfNAME = PC123456 <> Diweursejsfdjiwr - Randon línea de texto, queremos PC123456

$text.IndexOf("E=") 

- este es el "hallazgo" de comandos para Powershell

$text.substring(10,5) 

C1234 - este es el comando "MID" para Powershell

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

PC123456 - tada se ha encontrado y cortar nuestro texto

-RavonTUS

2

Si se divide el nombre del archivo de guión bajo y dot, obtienes una matriz de 3 cadenas. Unirse a la primera y tercera cuerda, es decir, con el índice 0 y 2

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

Otra forma de hacer lo mismo:

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

Sé que este hilo es un poco viejo, pero, yo estaba buscando algo similar y no pudo encontrarlo. Esto es lo que se me ocurrió. Se crea un objeto de cadena mediante la clase .Net cadena para exponer todos los métodos que normalmente se encuentran si se utiliza C#

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

Resultado: 201011221155.xml

Cuestiones relacionadas