【问题标题】:Find character position and update file name查找字符位置并更新文件名
【发布时间】:2011-07-03 00:28:16
【问题描述】:

使用 PowerShell 2.0 可以使用什么函数来查找字符串中的字符位置?

也就是说,如果使用 SQL Server,我会使用 CHARINDEX 或 PATINDEX。

我查看了使用 Select-String cmdlet,但它似乎没有做我需要它做的事情。

最终,我希望在文件名中找到一个“_”字符,然后将所有内容剥离为以下“。” .

示例文件名237801_201011221155.xml

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    该字符串是一个 .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("\")
    【解决方案2】:

    如果你用下划线和点分割文件名,你会得到一个由 3 个字符串组成的数组。加入第一个和第三个字符串,即索引为 0 和 2

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 为建议喝彩。我会将代码添加到我不断增长的 Powershell 工具箱中
      • 不客气。我确实认为 Get-Childitem *.xml | Rename-Item -NewName { "$($_.BaseName -replace '_[^_]+$','')$($_.Extension)" } 比 .Substring/.IndexOf 解决方案更容易。
      【解决方案4】:

      如果您使用 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 - 达达!它找到并剪切了我们的文本。

      【讨论】:

        【解决方案5】:

        OP 的解决方案从问题迁移到了答案:

        最终解决方案,以下删除所有字符,包括 <_> 到 <.> 用于当前目录中的所有 .xml 文件

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

        将以 237801.xml

        结尾

        【讨论】:

          【解决方案6】:

          我使用 .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

          【讨论】:

            猜你喜欢
            • 2016-04-10
            • 2023-02-02
            • 2013-07-24
            • 1970-01-01
            • 2012-12-24
            • 1970-01-01
            • 2021-12-21
            相关资源
            最近更新 更多