我下面有一个远程目录我有一个文件夹结构,如下所示
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
我怎样才能做到这一点?
答案 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