如何将第一个字符与Powershell脚本匹配

时间:2018-09-05 12:31:42

标签: regex powershell regex-negation

如果文件以字母开头,我尝试将其移动到某个文件夹,如果文件以字母以外的任何字母开头,则将其删除。

我的代码:

Function moveOrDelete($source, $dest)
{
    $aToZ = '^[a-zA-Z].*'
    $notALetter = '^[^a-zA-Z].*'

    Get-ChildItem -Path $source\$aToZ -Recurse | Move-Item -Destination $dest

    Get-ChildItem -Path $source\$notALetter -Recurse | Remove-Item
}

据我了解,插入符号在方括号之外时会与第一个字符匹配。换句话说,$aToZ变量中的正则表达式将匹配以字母开头的任何内容。 .*部分将允许文件名的其余部分为任意。括号内的插入号使该语句取反,因此,如果文件名以字母以外的任何其他字符开头,则它将匹配。我无法使其正常工作,并且没有收到任何错误,这使我相信我的正则表达式是错误的。

我已经使用包括以下工具在内的在线工具进行了检查:https://regex101.com/,他们将其签出。

我还使用了^[a-zA-Z]之类的正则表达式变体,但这些变体不起作用。诸如[a-zA-Z]*之类的某些模式可以移动文件,但这不是我想要的模式。

这是我称呼功能的方式:

moveOrDelete ".\source" ".\dest"

这是我正在使用的示例文件名:

a.txt
z.txt
1.txt
.txt

1 个答案:

答案 0 :(得分:2)

-Path参数不理解正则表达式,它接受一个字符串并且可以执行通配符,但不能执行复杂的字符串处理。

因此,您需要使用-match运算符对照正则表达式检查每个文件的名称。以下内容应有所帮助:

Function moveOrDelete($source, $dest)
{
    $aToZ = '^[a-zA-Z].*'
    $notALetter = '^[^a-zA-Z].*'
    Get-ChildItem -Path $source -Recurse | Where-Object { $_.name -match $aToZ } | Move-Item -Destination $dest
    Get-ChildItem -Path $source -Recurse | Where-Object { $_.name -match $notALetter } | Remove-Item
}

在这里,您需要使用Where-Object cmdlet过滤文件名,然后通过管道将其移至移动或删除。