我一直在研究一个PowerShell脚本,它可以在拼装嵌套文件夹时保留目录结构。尽管如此,我很难获得递归逻辑。递归逻辑
这是一个粗略的,所以没有任何try/catch错误代码呢。我已将Remove-Item
注释掉以防止意外运行。
我为此制定的逻辑如下。
- 检查& GET基地树子目录
- 转到上一级,再
- 检查继续,直到没有目录,然后返回一个级别。
- Cab目录,删除目录,写入自动提取日志(子目录cabs的文件名)。
- 重复过程中一个新的水平,并继续到基本目录
function Chkfordir ($clevel)
{
$dir = dir $clevel | ? { $_.PSIsContainer -eq $true } #Does Current Level have Folders?
if($dir -ne $null) # Yes
{
Chkfordir $dir #Go Deeper
}
if ($dir -eq $null) #Deepest Branch
{
return # Go Back One Level and begin Cabbing
}
$dir | % {
Compress-Directory $_.FullName (".\" + [string]$_.Name + ".cab")
echo ($_.FullName + ".cab" >> .\cleaf.log"
#Remove-Item -Recurse $_.FullName
return
}
}
函数调用Compress-Directory
是here。
编辑改变:
将重新邮编顺(08/18)
编辑08/18于是,我终于有机会来测试它和逻辑上似乎现在的工作。有一些问题。
大部分困难都伴随着PowerShell的问题和Compress-Directory不独立于路径的未被注意的问题。看起来我以后需要重新编写这个函数以实现路径独立。
PowerShell的问题出现在管道上的某个值的类型更改中。显然,从函数目录返回后,使用不同名称的成员函数将项目从System.IO.FileInfo更改为System.IO.DirectoryInfo。
由于重定向操作符在PowerShell中不起作用,Echo被添加内容替换。
还有一些不明的状态与之对抗。没有文件的叶目录会导致Compress-Directory出错或完全静默,不创建文件(因此不保留层次结构)。
解决方案是在返回之前为叶文件夹添加Add-Content,并将Add-Content移动到Compress-Directory之前,以便每个目录至少有一个文件。
我已经在下面包含了我的当前版本,但它是一项正在进行的工作。
function Chkfordir ($clevel)
{
$dir = dir $clevel | ? { $_.PSIsContainer -eq $true } # Get Folders?
if ($dir -eq $null) { #Check if deepest branch
Add-Content (Join-Path $_.PSPath "\leaf.log") ([string]$_.FullName + ".cab")
return $_ # Return one level up and cab
}
$dir | % { #for each sub go deeper
Chkfordir $_.FullName
Add-Content (Join-Path $_.PSParentPath "\branch.log") ([string]$_.FullName + ".cab")
Compress-Directory $_.FullName ([string]$_.Name + ".cab")
#Remove-Item $_.FullName -recurse
}
}
谢谢,我没有注意到,它没有采取每个子目录,并从那里递归。我已经更新了代码,我将在今天晚些时候测试它,当我有一些时间的时候。 – Lorek