用字母命名的目录路径的正则表达式

时间:2018-09-18 20:42:20

标签: powershell

我有很多这样命名的文件夹:

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脚本中,我想将某些文件(如果不存在,则创建目录)移动到正确的位置。例如,将FileABC.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个)执行相同的操作。

要匹配我所做的2个字母路径:

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

创建C:\ Folders \ A \ AA,C:\ Folders \ 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
}

但是文件放置不正确。例如,将FileABC.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}$')

但是然后我将不得不为每个字母A-Z制作一个,我认为这是不必要的。

1 个答案:

答案 0 :(得分:0)

由于您的示例未映射到相同的事物,因此无法完全辨别该算法,但是也许可以使用这种方法进一步优化算法以达到所需的效果。它不使用正则表达式,但会执行我认为与您想要或接近的映射。

# 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'

另请参阅“测试路径”,“新项目”,“移动项目”等。