web-dev-qa-db-fra.com

Trouver la position du personnage et mettre à jour le nom du fichier

Quelle fonction pourrais-je utiliser pour rechercher une position de caractère dans une chaîne à l'aide de PowerShell 2.0. 

je voudrais utiliser CHARINDEX ou PATINDEX si vous utilisez SQL Server. 

J'ai envisagé d'utiliser l'applet de commande Select-String, mais elle ne semble pas répondre à mes besoins. 

En fin de compte, je cherche un caractère "_" dans un nom de fichier et je supprime tout ce qui suit "." . 

Exemple de nom de fichier 237801_201011221155.xml

Solution finale, La section ci-dessous supprime tous les caractères compris entre <_> et <.> Pour tous les fichiers .xml du répertoire en cours.

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

Va se retrouver avec 237801.xml

13
Pixelated

La chaîne est une chaîne .NET, vous pouvez donc utiliser des méthodes .NET. Dans ton cas:

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

retournera 3, qui est la première occurrence d'espace dans la chaîne. Pour plus d'informations, voir: http://msdn.Microsoft.com/en-us/library/system.string.aspx

Pour votre besoin, essayez quelque chose comme:

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

Ou vous pouvez utiliser les expressions rationnelles:

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

(doit être ajusté en fonction de ce dont vous avez besoin).

33
Anders Zommarin

Si vous divisez le nom de fichier en traits de soulignement et en points, vous obtenez un tableau de 3 chaînes. Joignez la première et la troisième chaîne, c’est-à-dire avec les index 0 et 2 

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

Une autre façon de faire la même chose:

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

Si vous travaillez avec des fichiers réels (par opposition à une sorte de données de chaîne), que diriez-vous des solutions suivantes?

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

(ou utilisez _.+$ si vous voulez tout couper du premier trait de soulignement.)

1
Bergius

Si vous utilisez Excel, la commande sera Find et MID. Voici à quoi cela ressemblerait dans Powershell.

 $text = "asdfNAME=PC123456<>Diweursejsfdjiwr"

asdfNAME = PC123456 <> Diweursejsfdjiwr - Ligne de texte Randon, nous voulons PC123456

 $text.IndexOf("E=")

7 - il s'agit de la commande "FIND" pour Powershell

 $text.substring(10,5)

C1234 - il s'agit de la commande "MID" pour Powershell

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

PC123456 - tada il a trouvé et a coupé notre texte

-RavonTUS

1
user4279989

Je sais que ce fil est un peu vieux, mais je cherchais quelque chose de similaire et je ne le trouvais pas. Voici ce que je suis venu avec. Je crée un objet string en utilisant la classe .Net String pour exposer toutes les méthodes normalement trouvées en utilisant C #

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

Résultat: 201011221155.xml

0
Ernest Correale