【问题标题】:How to cut specific string?如何剪切特定的字符串?
【发布时间】:2019-06-10 20:07:41
【问题描述】:

我有一个长度不同的字符串。我想在我的字符串中剪切一个特定的单词。 请帮忙,我是 PowerShell 新手。

我试过这段代码,它仍然不是我需要的。

$String = "C:\Users\XX\Documents\Data.txt"
$Cut = $String.Substring(22,0)
$Cut

我的期望是我可以返回单词Data

【问题讨论】:

标签: powershell


【解决方案1】:

假设字符串总是相同的格式(即以文件名结尾的路径),那么有很多方法可以做到这一点,例如使用正则表达式。这是一种不太传统的方法:

# Define the path
$filepath = "C:\Users\XX\Documents\Data.txt"

# Create a dummy fileinfo object
$fileInfo = [System.IO.FileInfo]$filePath

# Get the file name property
$fileInfo.BaseName

当然,您可以一步完成所有这些:

([System.IO.FileInfo]"C:\Users\XX\Documents\Data.txt").BaseName

【讨论】:

  • 正则表达式不是为了这个。为此有一个 C# 方法 Path.GetFileNameWithoutExtension
  • “正则表达式不适合这个” @Bakudan,正则表达式是什么意思?
  • 关键是有专门用于文件路径的函数。正则表达式更适合文本处理。根据wikipedia,“常见应用包括数据验证、数据抓取(尤其是网页抓取)、数据整理、简单解析、语法高亮系统的生产以及许多其他任务。”
  • “正则表达式更适合文本处理” @Bakudan 我完全知道RegEx isn't always the best tool for the job。这可能就是为什么我实际上并未提倡它,只是将其作为多种可能性之一提及(参见此问题的其他答案)。我回答的主要目的是向提问者展示一种不同的方法来考虑——就像你在实际答案中给出一种方法,而在 cmets 中给出另一种方法。
【解决方案2】:

如果路径是现有路径,您可以使用

(Get-Item $String).BaseName

否则

(Split-Path $String -Leaf) -Replace '\.[^\.]*$'

【讨论】:

    【解决方案3】:

    虽然在该特定示例中,最简单的方法是使用 Substring(startPosition,length) 提取文件名,但您可能希望使用如下内容:

    (("C:\Users\XX\Documents\Data.txt".split("\\"))[-1].Split("."))[0]
    

    说明:

    ("C:\Users\XX\Documents\Data.txt".split("\\"))[-1]
    

    该部分将路径拆分为\ 并返回最后一项(顺便说一句,转义似乎不是强制性的,因此您可以使用.split("\") 而不是.split("\\"))。从中您会收到Data.txt,因此您必须将名称和扩展名分开。您可以通过拆分. 并选择返回的第一个元素来做到这一点

    【讨论】:

      【解决方案4】:

      根据您的输入有多种方法 -

      方法 1 - 使用子字符串函数进行硬编码。

      $String = "C:\Users\XX\Documents\Data.txt"
      $Cut = $String.Substring(22,4)
      $Cut
      

      上述方法适用于单个输入,但对于不同长度的多个输入将变得难以管理。

      方法 2 - 使用split 方法

      $String = "C:\Users\XX\Documents\Data.txt"
      $cut = $String.Split("\")[-1].split(".")[0]
      $cut
      

      Split 方法将字符串拆分为子字符串。索引[-1] 将返回split 方法返回的最后一个值。 第二个拆分是从单词Data.txt 中返回单词Data

      方法3 - 如果输入的是文件路径

      $string = Get-ChildItem $env:USERPROFILE\Desktop -File | select -First 1
      $Cut = $String.BaseName
      

      更多关于方法 3 here.

      【讨论】:

        【解决方案5】:

        如果你可以使用Powershell 6 - SplitPath

        #Requires -Version 6.0
        Split-Path $String -LeafBase
        

        【讨论】:

          猜你喜欢
          • 2017-07-11
          • 2021-01-08
          • 2013-01-14
          • 1970-01-01
          • 2013-06-01
          • 2013-08-26
          • 2015-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多