列出订单中的目录文件并使用powershell替换

时间:2014-10-24 14:43:07

标签: powershell

我下面有一个远程目录我有一个文件夹结构,如下所示

Logs 
Data
Install
Rollback

我知道如何从有问题的目录中显示,但我需要按照以下顺序排序的输出,以lastwritetime排序。

\\shareddrive\xyz\Install\file1
\\shareddrive\xyz\Install\file2
\\shareddrive\xyz/Install\file3
\\shareddrive\xyz\Rollback\file1
\\shareddrive\xyz\Data\file1
\\shareddrive\xyz\Logs\file1

现在替换文本文件中的目录位置,如下所示

..\xyz\Install\file1
..\xyz\Install\file2
..\xyz/Install\file3
..\xyz\Rollback\file1
..\xyz\Data\file1
..\xyz\Logs\file1

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我觉得你要求按照确切的顺序输出文件。为了对收集数据略有不同,我将介绍以下内容:

$uncPath = "\\servername\xyz"
[void]($uncPath -match '^(?<Server>\\\\\w+)')
$shareServerRegex = [regex]::Escape($Matches.Server)
$shareServerReplacement = ".."
$folderOrder = "\Install\","\Rollback\","\Data\","\Logs\"
$data = Get-ChildItem $uncPath -Recurse

$folderOrder | ForEach-Object{
    $currentFolder = [regex]::escape($_)
    $data | Where-Object{$_.FullName -match $currentFolder} | 
           Sort-Object LastWriteTime | 
           ForEach-Object{$_.FullName -replace $shareServerRegex,$shareServerReplacement}
} | Out-File -Encoding ascii -FilePath c:\pathtofile.txt

$uncPath包含我们要解析的文件夹的路径。为了使脚本更加动态,我们将\ serverpath收集到$ Matches.Server中,并使用regex中的Escape静态方法构建正则表达式匹配字符串,我们将很快用它按照您的要求按摩路径。将$uncPath中的所有文件收集到变量$data中。使用$folderOrder数组,我们遍历每个项目,并选择将其作为文件夹路径的一部分的文件。您将看到该数组具有前后斜杠的文件夹。这将确保没有包含任何这些单词的文件本身最终以错误的顺序进行过滤。同样,由于我们使用正则表达式中控制字符的斜杠,我们使用Escape方法匹配来自$data的文件,我们需要的是我认为正确的顺序。证明就在布丁中。

..\xyz\Install\file1                                                             
..\xyz\Install\file2
..\xyz\Install\file3                                                             
..\xyz\Rollback\file1                                                            
..\xyz\Data\file1                                                                
..\xyz\Logs\file1

总之,我试图帮助你解决的是输出。您可以忽略我的所有其他代码,只关注我认为您需要帮助的内容。只要您填充$data并设置或替换-replace

的参数,此功能就会有效
$folderOrder = "\Install\","\Rollback\","\Data\","\Logs\"
...
$folderOrder | ForEach-Object{
    $currentFolder = [regex]::escape($_)
    $data | Where-Object{$_.FullName -match $currentFolder} | 
           Sort-Object LastWriteTime | 
           ForEach-Object{$_.FullName -replace $shareServerRegex,$shareServerReplacement}
} | Out-File -Encoding ascii -FilePath c:\pathtofile.txt