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



我有大量的文件夹是这样命名的:

C:\文件夹\A C:\文件夹\A\AB\ABC C:\Folder\E\EA\EAB\EABA C:\文件夹\A\AZ\AZA C:\Folder\B\BA\BAE

在PowerShell脚本中,我想将一些文件(如果不存在,则创建目录(移动到正确的位置。例如,FileABC.txt to C:\Folder\A\AB\ABC 和 FileBA.txt to C:\Folder\B\BA。

我现在拥有的是:

$naming只包含来自 CSV 的所有字母代码。

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

这将创建 C:\Folder\A。所以我对所有其他顶级文件夹(只有 6 个(做同样的事情。

为了匹配我做的 2 个字母路径:

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

这将创建 C:\Folder\A\AA、C:\Folder\A\AB 等。

当我想创建 3 或 4 个字母目录时出现问题:

我试过这个:

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

和:

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

但是文件放置不正确。例如,FileABC.txt 被移动到随机位置,如 C:\Folder\A\AK\ABC。

@edit

我还注意到文件夹没有在正确的位置创建。带有 3 或 4 个字母组合的文件夹放置,这些文件夹似乎是随机的:

C:FoldersEEAEBC
C:FoldersAABAZA
C:FoldersEECEFGECXA

我可以做:

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

但是我必须为每个字母 A-Z 制作一个,我觉得这应该是不必要的。

无法完全辨别算法,因为您的示例不会映射到相同的事物,但也许通过这样的方法,您可以进一步将其细化为您想要的。 它不使用正则表达式,但确实将我相信映射到您想要的或接近它。

# E.g FileABC.txt to C:FoldersAABABC and FileBA.txt to C:FoldersBBA.
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'

另请参阅测试路径、新项、移动项等。

相关内容

  • 没有找到相关文章

最新更新