【发布时间】:2011-07-03 00:28:16
【问题描述】:
使用 PowerShell 2.0 可以使用什么函数来查找字符串中的字符位置?
也就是说,如果使用 SQL Server,我会使用 CHARINDEX 或 PATINDEX。
我查看了使用 Select-String cmdlet,但它似乎没有做我需要它做的事情。
最终,我希望在文件名中找到一个“_”字符,然后将所有内容剥离为以下“。” .
示例文件名237801_201011221155.xml
【问题讨论】:
使用 PowerShell 2.0 可以使用什么函数来查找字符串中的字符位置?
也就是说,如果使用 SQL Server,我会使用 CHARINDEX 或 PATINDEX。
我查看了使用 Select-String cmdlet,但它似乎没有做我需要它做的事情。
最终,我希望在文件名中找到一个“_”字符,然后将所有内容剥离为以下“。” .
示例文件名237801_201011221155.xml
【问题讨论】:
该字符串是一个 .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] }
(必须根据您的需要进行调整)。
【讨论】:
$path = get-location"$path".IndexOf("\")
如果你用下划线和点分割文件名,你会得到一个由 3 个字符串组成的数组。加入第一个和第三个字符串,即索引为 0 和 2
$x = '237801_201011221155.xml'
( $x.split('_.')[0] , $x.split('_.')[2] ) -join '.'
做同样事情的另一种方法:
'237801_201011221155.xml'.split('_.')[0,2] -join '.'
【讨论】:
如果您使用的是实际文件(而不是某种字符串数据),那么下面的呢?
$files | % { "$($_.BaseName -replace '_[^_]+$','')$($_.Extension)" }
(如果您想从第一个下划线处删除所有内容,请使用 _.+$。)
【讨论】:
Get-Childitem *.xml | Rename-Item -NewName { "$($_.BaseName -replace '_[^_]+$','')$($_.Extension)" } 比 .Substring/.IndexOf 解决方案更容易。
如果您使用 Excel,则命令将是 Find 和 MID。这是它在 PowerShell 中的样子。
$text = "asdfNAME=PC123456<>Diweursejsfdjiwr"
asdfNAME=PC123456Diweursejsfdjiwr - 随机文本行,我们想要 PC123456
$text.IndexOf("E=")
7 - 这是 Powershell 的“查找”命令
$text.substring(10,5)
C1234 - 这是 Powershell 的“MID”命令
$text.substring($text.IndexOf("E=")+2,8)
PC123456 - 达达!它找到并剪切了我们的文本。
【讨论】:
OP 的解决方案从问题迁移到了答案:
最终解决方案,以下删除所有字符,包括 <_> 到 <.> 用于当前目录中的所有 .xml 文件
Get-Childitem *.xml | Rename-Item -newname ` { $_.name -replace $_.name.SubString($_.name.IndexOf("_"), ` $_.name.LastIndexOf(".") - $_.name.IndexOf("_") ),''}将以 237801.xml
结尾
【讨论】:
我使用 .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
【讨论】: