我想制作一个 PowerShell 脚本,它获取我的音乐库中的每个文件,然后对其进行哈希求和并将其写入文件中,如下所示:
test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198
当我启动脚本时,我需要它首先将我的音乐库与已有的值进行比较,但为此我只想切断
;
之后的所有内容,以便它可以将文件名与文件名(或文件路径)进行比较。 ..但我不知道如何做到这一点。
我尝试通过
$name = $name -replace ";*",""
替换该值,但这不起作用。我也尝试过过滤...但我不知道如何。
$pos = $name.IndexOf(";")
$leftPart = $name.Substring(0, $pos)
$rightPart = $name.Substring($pos+1)
在内部,PowerShell 使用 String 类。
$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$text.split(';')[1].split(' ')
您可以使用
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
$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 正则表达式引擎看到的内容。
这确实适用于分隔符之间特定数量的字符的特定分隔符。我在尝试在 for every 循环中使用它时遇到了很多问题,其中位置发生了变化,但分隔符是相同的。例如,我使用反斜杠作为分隔符,并且只想使用反斜杠右侧的所有内容。问题是,一旦定义了位置(从开头算起 71 个字符),无论分隔符实际在脚本中的位置如何,它每次都会使用 $pos 作为 71。我找到了另一种使用分隔符和 .split 来分解事物的方法,然后使用 split 变量来调用各个部分,例如第一部分是 $variable[0],第二部分是 $variable[1]。
我有一个充满文件的目录,其中包括一些名为发票无产品编号.pdf 的文件,并且想按产品编号对这些文件进行排序,所以...
get-childitem *.pdf | sort-object -property @{expression={$\_.name.substring($\_.name.indexof("-")+1)}}
请注意,如果没有
-
,则按 $_.name
排序
使用正则表达式,结果在 $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
对于我对@VVS的评论,如果分隔符是不是空格的字符,他的解决方案就可以完美工作。所以这里的代码包括您的案例和空格
$pos = $name.IndexOf(";")
$leftPart, $rightPart = $name -split ';',2
谁需要空间:
$pos = $name.IndexOf(" ")
$leftPart, $rightPart = $name -split ' ',2