我有很多这样命名的文件夹:
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制作一个,我认为这是不必要的。
答案 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'
另请参阅“测试路径”,“新项目”,“移动项目”等。