查找字符位置并更新文件名

时间:2011-02-23 19:06:06

标签: powershell powershell-v2.0

我可以使用什么函数在PowerShell 2.0中查找字符串中的字符位置。

,如果使用SQL Server,我会使用CHARINDEX或PATINDEX。

我查看了使用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

结束

5 个答案:

答案 0 :(得分:33)

字符串是.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] }

(必须根据您的需要进行调整)。

答案 1 :(得分:2)

如果在下划线和点上拆分文件名,则会得到一个包含3个字符串的数组。加入第一个和第三个字符串,即索引0和2

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

另一种做同样事情的方法:

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

答案 2 :(得分:1)

如果你正在使用实际文件(而不是某种字符串数据),那么下面呢?

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

(如果你想从第一个下划线中删除所有内容,请使用_.+$。)

答案 3 :(得分:1)

如果您使用Excel,那么命令将是Find和MID。这是Powershell中的样子。

 $text = "asdfNAME=PC123456<>Diweursejsfdjiwr"

asdfNAME = PC123456 &lt;&gt; Diweursejsfdjiwr - Randon文字行,我们要 PC123456

 $text.IndexOf("E=")

7 - 这是&#34; FIND&#34; Powershell的命令

 $text.substring(10,5)

C1234 - 这是&#34; MID&#34; Powershell的命令

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

PC123456 - tada已找到并剪切了我们的文字

-RavonTUS

答案 4 :(得分:0)

我知道这个线程有点旧,但是我正在寻找类似的东西而找不到它。这就是我想出来的。我使用.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