Регулярное выражение для dirpaths, названных буквами - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть большое количество папок с такими именами:

C:\Folders\A
C:\Folders\A\AB\ABC
C:\Folders\E\EA\EAB\EABA
C:\Folders\A\AZ\AZA
C:\Folders\B\BA\BAE

И в скрипте PowerShell я хочу переместить некоторые файлы (или создать каталог, если он не существует) вправоместо.Например, файлABC.txt в C: \ Folders \ A \ AB \ ABC и FileBA.txt в C: \ Folders \ B \ BA.

Теперь у меня есть следующее:

$naming просто содержит все буквенные коды из CSV.

if ($naming -match '^A$') {
    $folderA = C:\Folders
    New-Item -Name $naming -Path $folderA -Type Directory
}

, который создает C: \ Folders \ A.Поэтому я делаю то же самое для всех остальных папок верхнего уровня (их всего 6).

Для сопоставления двухбуквенных путей, которые я делаю:

if ($naming -match '^A[A-Z]{1}$'){
    $folderA2 = "C:\Folders\A\"
    New-Item -Name $naming -Path $folderA2 -Type Directory
}

Что создает C: \Папки \ A \ AA, C: \ Папки \ A \ AB и т. Д.

Проблема возникает, когда я хочу создать 3 или 4-буквенные каталоги:

Я попробовал это:

if ($naming -match '^A[A-Z]{2}$') {
    $folderA3 = 'C:\Folders\A\$($naming)\'
    New-Item -Name $naming -Path $folderA3 -Type Directory
}

и:

if ($naming -match '^A[A-Z]{3}$') {
    $folderA3 = 'C:\Folders\A\$($naming)\$($naming)\'
    New-Item -Name $naming -Path $folderA3 -Type Directory
}

Но файлы размещены неправильно.Например, файлABAB.txt перемещается в случайные места, такие как C: \ Folders \ A \ AK \ ABC.

@ edit

Я также заметил, что папки создаются не в нужном месте.Папки с комбинациями из 3 или 4 букв размещаются в случайном порядке:

C:\Folders\E\EA\EBC
C:\Folders\A\AB\AZA
C:\Folders\E\EC\EFG\ECXA

Я мог бы сделать:

if ($naming -match '^AB[A-Z]{2}$')
if ($naming -match '^AC[A-Z]{2}$')

Но тогда мне нужно было бы сделать одну для каждой буквы AZ, чтоя чувствую, что в этом нет необходимости.

1 Ответ

0 голосов
/ 19 сентября 2018

Невозможно полностью распознать алгоритм, потому что ваши примеры не сопоставляются с одними и теми же вещами, но, возможно, с помощью такого подхода вы можете еще более уточнить, что вы делаете.Он не использует регулярные выражения, но выполняет сопоставление, которое, я полагаю, с тем, что вам нужно, или близко к нему.

# E.g FileABC.txt to C:\Folders\A\AB\ABC and FileBA.txt to C:\Folders\B\BA.

function FileToPath($file)
{
    $filePrefix = 'File'
    $destPrefix = 'c:\Folders'

    $fileParts = [System.IO.Path]::GetFileNameWithoutExtension($file) -split $filePrefix
    $destPath = $destPrefix
    $len = $fileParts[1].Length
    for ($i = 0; $i -lt $len; $i++)
    {
        $destPath = Join-Path $destPath $fileParts[1].Substring(0,$i+1)
        # or maybe the below?
        #$destPath = Join-Path $destPath $fileParts[1][$i]
    }

    return (Join-Path $destPath $file)
}

'=== 1 ==='
$f = FileToPath 'FileABC.txt'
$f
Split-Path -Path $f -Parent
Split-Path -Path $f -Leaf

'=== 2 ==='
FileToPath 'FileBA.txt'

См. Также «Тест-путь», «Новый элемент», «Перемещение-элемент» и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...