我试图将文件移动到某个文件夹(如果它们以字母开头)并删除它们,如果它们以字母以外的任何内容开头。
我的代码:
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
-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过滤文件名,然后通过管道移动或移除。