用于扫描目录并返回分隔文件信息和超链接的Powershell脚本

用于扫描目录并返回分隔文件信息和超链接的Powershell脚本,powershell,Powershell,关于我的意图的一点背景: 第一个函数getFileName的目的是读取主文件夹中的目录,其中包含许多设施的数字信息,并返回文件列表及其基本名称 第二个函数SplitFileNames接受GetFileNames的输出,并使用下划线作为分隔符将名称分成3部分。文件名的结构都是这样的;站点代码\u FACNUM\u文件类型,例如DKFX\u 00099\u地图。这三个部分中的每一部分都形成单独的列,然后我将这些列导入Access中的数据库 此外,在此之前我从未使用过Powershell,到目前为止,

关于我的意图的一点背景:

第一个函数getFileName的目的是读取主文件夹中的目录,其中包含许多设施的数字信息,并返回文件列表及其基本名称

第二个函数SplitFileNames接受GetFileNames的输出,并使用下划线作为分隔符将名称分成3部分。文件名的结构都是这样的;站点代码\u FACNUM\u文件类型,例如DKFX\u 00099\u地图。这三个部分中的每一部分都形成单独的列,然后我将这些列导入Access中的数据库

此外,在此之前我从未使用过Powershell,到目前为止,我的经验基本上是结合了反向工程和来自多个源代码的拼接代码,当然还有我自己的一些作品

我的问题/尊敬的请求如下:

  • 我几乎可以肯定的是,一定有更好的方法来完成我想要完成的事情,而我只是没有对我所经历的信息有足够的理解来实现它。因此,如果有任何改进建议,我将不胜感激

  • 我还需要包含在FullName列中的超链接信息,但不幸的是,我无法让它正常工作,因为我必须只将BaseName分成3部分

  • 谢谢大家!

    $targetPath = "C:\Users\mattm\Google Drive\TestDatabase\"
    $outputPath_1 = "C:\Users\mattm\Google Drive\Powershell Scripts\Facilities Database Scanner\outputScan_1.csv"
    $outputPath_2 = "C:\Users\mattm\Google Drive\Powershell Scripts\Facilities Database Scanner\outputScan_2.csv"
    $delimPath = "_"
    
    
    Function GetFileNames([string]$path, [string]$outputFile) {
      $list = Get-ChildItem $path -Recurse | where {!$_.PSIsContainer}
      $list | Select-Object BaseName | Export-Csv -NoTypeInformation $outputFile 
    }
    
    GetFileNames $targetPath $outputPath_1
    
    
    Function SplitFileNames([string]$inputFile, [string]$outputFile) {
    
        $inputData = Get-Content $inputFile | select -Skip 1
        $array = @()
        $outArray = @()
    
        $inputData | Foreach{
                        $elements = $_.split($delimPath)
                        $array += ,@($elements[0], $elements[1], $elements[2])
                     }
    
    
        Foreach($value in $array){
            $outArray += New-Object PSObject -Property @{
            'SiteCode' = $value[0]
            'FacilityNumber' = $value[1]
            'FileTypeCode' = $value[2]
            }
    
    
        }
    
    $outArray | Select-Object "SiteCode","FacilityNumber","FileTypeCode" | ConvertTo-Csv -NoTypeInformation | % {$_ -replace '"',""} | Out-File $outputFile -fo -en ascii
    
    }
    
    SplitFileNames $outputPath_1 $outputPath_2
    

    您可能需要一点时间来学习Powershell的基础知识。逆向工程可能不是这方面最好的老师从以下内容开始:

    $Path = 'Enter your path here'
    Get-ChildItem -Path $Path -Recurse -File | 
        ForEach-Object{
            $One,$Two,$Three = $_.BaseName -split '_' 
            [PSCustomObject][ordered]@{
                SiteCode = $One
                FacNum = $Two
                FileType = $Three
                BaseName = $_.BaseName
                Hyperlink = $_.FullName
            }
        }
    

    我对这个新版本的结果非常满意

    $moduleCustomUIMessage ='path to UI module'
    $outputFile_3 = 'output path'
    $Path = 'target path of directory to scan'
    
    Import-Module $moduleCustomUIMessage
    
    $results = Get-ChildItem -Path $Path -Recurse | where {!$_.PSIsContainer} | 
        ForEach-Object{
            $One,$Two,$Three = $_.BaseName -split '_' 
            [PSCustomObject]@{
                SiteCode = $One
                FacNum = $Two
                FileType = $Three
                BaseName = $_.BaseName
                Hyperlink = $_.FullName
            }
        } | Select-Object SiteCode, FacNum, FileType, BaseName, Hyperlink | Export-Csv -NoTypeInformation $outputFile_3 
    
        CustomUIMessage $outputFile_3
    

    “FullName中包含的超链接信息”实际上是什么意思?它是FileInfo类的属性,在调用Get-ChildItem cmdlt时返回。它获取文件或目录的完整路径。现在我更困惑了。你在找什么样的文件?我的客户端上没有具有此名称的属性。这很奇怪,我相信我正在桌面上运行Powershell 5.0,并且我正在查找所有文件类型。我拥有的基本上是11k+文档和图片(如地图、现场检查等),它们都根据它们所属的设施分类到文件夹中。当他们继续向这些文件夹添加新的数字文档时,我希望他们能够执行此脚本并返回文件夹中所有文件的列表,并且我需要输出有4列;站点代码、设施编号、文件类型(地图、图片、契约等)、文件路径(我用于在Access中创建超链接)。很抱歉,我现在意识到我的文件类型代码非常误导。实际上,我并不关心它是PDF、XML、JPEG还是其他格式,在我的上下文中,它指的是对文档内容的简写。因此,例如,特定设施的平面图文件名可能是LUAJ_00090_FLRPLN.pdfHaha,我绝对计划!我只是在一个时间紧迫的情况下演示了一个可行的解决方案,因为我还局限于可以在他们的机器上使用的应用程序。我当然更愿意使用Python。谢谢你的回复,我将从这个开始做更多的研究。你对书籍/资源也有什么好的建议吗?有很多学习的方法。你只需要对你所做的事情做出承诺。从微软虚拟学院和YouTube上的视频开始。只需在任一站点搜索启动PowerShell。阅读内置的帮助文件。然后查看Windows PowerShell生存指南上的TechNet博客,甚至是类似本讨论的建议。谢谢你的建议,我一定会研究这些以及我今天开始读的那本书。在承诺方面,我当然有能力,这只是一个渐进的学习过程,因为我只有空余时间来学习。我对这种可能性非常兴奋。实际上,你不需要选择对象部分。无论如何,应该只有指定的属性。但如果它能起作用,那就太好了-那我得试着把那部分去掉。上周我读了另一篇文章,其中说调用Select对象会强制导出列时所需的顺序。这与数据库无关。我非常感谢你帮我解决这个问题!如果您有一个相当最新版本的Powershell,那么当您为
    get ChildItem
    使用参数
    -File
    时,您可以去掉关于“容器”的
    Where对象。如果您想拥有对象属性的特定顺序,可以使用加速器
    [ordered]
    。我更新了我的答案。很抱歉@Olaf的延迟,我确认我目前已经安装了5.1版。我刚做了你建议的修改,效果非常好!关于将此脚本生成的输出CSV导入Access中的相应表,我确实有一个后续问题,但我可能应该将其作为一个单独的问题发布。到目前为止,我至少在Access中执行了这个脚本。我很高兴它很有用。我希望Access能够自行导入有效的CSV文件。;-)