【发布时间】:2018-12-26 13:44:11
【问题描述】:
这个问题的要点是:
所以if ($C -match $b.Name) 似乎认为字符串的部分 匹配是匹配的?有没有更好的方法来强制 complete [match] 字符串?
我有一个目录,其中包含大量 .7z 文件。我需要经常清理这个目录。还有另一个脚本,早于我在这里工作,目前正在运行,但它由 3000 行组成,并且不断生成不正确的匹配项,并且不记录移动的内容或删除的内容。它如此庞大的部分原因是它有大量的路径,这些文件需要在其中进行硬编码。有时,这些路径会发生变化,更新起来很麻烦。
所以我开始制作一个小得多的脚本,其中包含在 CSV 文件中引用的所有这些路径。除了这些路径之外,CSV 文件中还记录了已知的文件名。
我正在尝试将文件名与我的 CSV 文件中记录的名称进行匹配。它通常有效,但有时我会得到不正确的匹配项。
假设我有两个以相似开头的文件,Apple 和 Apple_Pie。 Apple 将匹配 Apple 并移动到正确的目录,但 Apple_Pie 将首先匹配 Apple 并移动到错误的目录。在 $C 变量被清除之前,它会将 Apple_Pie 匹配到正确的目录,但此时 Apple_Pie 不再存在于需要从中移动的原始目录中。
所以if ($C -match $b.Name) 似乎认为字符串的部分匹配是匹配的?有没有更好的方法来强制一个完整的字符串?
我认为我对 -match 应该如何工作的期望有点偏离。
我在这里使用的正则表达式是删除由另一个自动化过程添加到文件名的日期时间的每个文件名。我用它来隔离我想要匹配的文件名。
$Wild = "C:\Some\Folder\With\Files\"
$CSV = "C:\Another\Folder\Paths.csv"
$Content = gci $wild
$Reg1 = [regex] '_[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'
$Reg2 = [regex] '[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'
$Paths = import-csv -path $CSV -header Name, Path
foreach ($a in $content) {
$c = $a.BaseName
if ($c -match $reg1) {
$c = $c -replace $regyear
}
elseif ($c -match $reg2) {
$c = $c -replace $reg2
}
foreach ($b in $Paths) {
if ($c -match $b.Name) {
Do something
}
}
}
【问题讨论】:
-
我将首先指出,如果可以在字符串中的任何位置找到模式,则默认情况下正则表达式将为真。如果要在字符串中的某些位置查找字符串,请使用
^指示字符串的开头,使用$指示字符串的结尾。要匹配整个字符串,请同时使用。
标签: regex powershell string-matching