Как сопоставить первые символы с помощью сценария PowerShell - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь переместить файлы в определенную папку, если они начинаются с буквы, и удалить их, если они начинаются с чего-либо, кроме буквы.

Мой код:

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 голосов
/ 05 сентября 2018

Аргумент -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, а затем направить или удалить их.

...