如果文件以字母开头,我尝试将其移动到某个文件夹,如果文件以字母以外的任何字母开头,则将其删除。
我的代码:
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
答案 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过滤文件名,然后通过管道将其移至移动或删除。