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

How to match first characters with a powershell script

我正在尝试将文件以字母开头的文件移动到某个文件夹,如果文件以非字母开头的文件删除它们。

我的代码:

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 过滤文件名,然后通过管道移动或删除。