如何在 PowerShell 中截断分隔符之后/之前的字符串中的文本

问题描述 投票:0回答:8

我想制作一个 PowerShell 脚本,它获取我的音乐库中的每个文件,然后对其进行哈希求和并将其写入文件中,如下所示:

test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198

当我启动脚本时,我需要它首先将我的音乐库与已有的值进行比较,但为此我只想切断

;
之后的所有内容,以便它可以将文件名与文件名(或文件路径)进行比较。 ..但我不知道如何做到这一点。

我尝试通过

$name = $name -replace ";*",""
替换该值,但这不起作用。我也尝试过过滤...但我不知道如何。

string powershell
8个回答
76
投票
$pos = $name.IndexOf(";")
$leftPart = $name.Substring(0, $pos)
$rightPart = $name.Substring($pos+1)

在内部,PowerShell 使用 String 类


22
投票
$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"

$text.split(';')[1].split(' ')

9
投票

您可以使用

Split

$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$separator = ";" # you can put many separator like this "; : ,"

$parts = $text.split($separator)

echo $parts[0] # return test.txt
echo $parts[1] # return the part after the separator

4
投票

$name -replace ";*", ""

您很接近,但您使用了通配符表达式的语法,而不是正则表达式,这是

-replace
运算符所期望的。

因此(哈希序列缩短):

PS> 'test.txt ; 131 136 80 89 119 17 60 123 210 121 188' -replace '\s*;.*'
test.txt

注:

  • 省略替换文本操作数(第二个 RHS 操作数)隐式使用

    ""
    (空字符串),即它有效地删除正则表达式匹配的内容。

  • .*
    表示正则表达式中字符 (
    *
    ) 的潜在空运行 (
    .
    ) - 它相当于通配符表达式中的
    *
    本身 的正则表达式。

  • 在正则表达式中的

    \s*
    之前添加
    ;
    还会删除文件名后的尾随空格 (
    \s
    )。

  • 我使用

    '...'
    而不是
    "..."
    来包围正则表达式,以防止 PowerShell 预先扩展的内容之间发生混淆(请参阅 PowerShell 中的可扩展字符串 和 .NET 正则表达式引擎看到的内容。


1
投票

这确实适用于分隔符之间特定数量的字符的特定分隔符。我在尝试在 for every 循环中使用它时遇到了很多问题,其中位置发生了变化,但分隔符是相同的。例如,我使用反斜杠作为分隔符,并且只想使用反斜杠右侧的所有内容。问题是,一旦定义了位置(从开头算起 71 个字符),无论分隔符实际在脚本中的位置如何,它每次都会使用 $pos 作为 71。我找到了另一种使用分隔符和 .split 来分解事物的方法,然后使用 split 变量来调用各个部分,例如第一部分是 $variable[0],第二部分是 $variable[1]。


0
投票

我有一个充满文件的目录,其中包括一些名为发票无产品编号.pdf 的文件,并且想按产品编号对这些文件进行排序,所以...

get-childitem *.pdf | sort-object -property @{expression={$\_.name.substring($\_.name.indexof("-")+1)}}

请注意,如果没有

-
,则按
$_.name

排序

0
投票

使用正则表达式,结果在 $matches[1]:

$str = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$str -match "^(.*?)\s\;"
$matches[1]
test.txt

0
投票

对于我对@VVS的评论,如果分隔符是不是空格的字符,他的解决方案就可以完美工作。所以这里的代码包括您的案例和空格

$pos = $name.IndexOf(";")
$leftPart, $rightPart = $name -split ';',2

谁需要空间:

$pos = $name.IndexOf(" ")
$leftPart, $rightPart = $name -split ' ',2
© www.soinside.com 2019 - 2024. All rights reserved.