我有大量的文件夹是这样命名的:
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'
另请参阅测试路径、新项、移动项等。