【问题标题】:Powershell script to scan through directories and return delimited file information and hyperlink用于扫描目录并返回分隔文件信息和超链接的 Powershell 脚本
【发布时间】:2018-02-27 03:01:18
【问题描述】:

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

第一个函数 GetFileNames 的目的是读取包含有关许多设施的数字信息的主文件夹中的目录,并返回带有它们的 BaseName 的文件列表。

第二个函数,SplitFileNames,获取 GetFileNames 的输出,并使用下划线作为分隔符将名称拆分为 3 部分。文件名的结构都是这样的; SITECODE_FACNUM_FILETYPE,例如 DKFX_00099_MAP。这 3 个部分中的每一个都形成了单独的列,然后我将这些列导入 Access 中的数据库中。

另外,在此之前我从未使用过 Powershell,到目前为止我的经验基本上是逆向工程和拼接来自多个来源的代码的组合,显然是我自己的一些写作。

我的问题/尊敬的请求是:

  1. 我几乎可以肯定一定有更好的方法来完成我想要完成的事情,而且我只是对我所经历的信息没有足够的理解它发生了。因此,我绝对会感谢任何改进建议。

  2. 我还需要包含在 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

【问题讨论】:

  • FullName 中包含的超链接信息”到底是什么意思?
  • FileInfo类的属性,调用Get-ChildItem cmdlt时返回。它获取文件或目录的完整路径。
  • 现在我更加困惑了。您在寻找什么样的文件?我的客户没有同名的房产。
  • 这很奇怪,我相信我在我的桌面上运行 Powershell 5.0,并且我正在寻找所有文件类型。我拥有的基本上是 11k+ 文档和图片(如地图、现场检查等),它们都根据它们所属的设施分类到文件夹中。当他们继续向这些文件夹中添加新的数字文档时,我希望他们能够执行此脚本并返回文件夹中所有文件的列表,并且我需要输出有 4 列;站点代码、设施编号、文件类型(地图、图片、契约等)、文件路径(我用来在 Access 中创建超链接)。
  • 我很抱歉,我现在意识到我的 FileTypeCode 非常具有误导性。我实际上并不关心它是 PDF、XML、JPEG 还是其他格式,在我的上下文中,它指的是文档的简写形式。例如,特定设施的平面图文件名可能是 LUAJ_00090_FLRPLN.pdf

标签: powershell


【解决方案1】:

您可能需要一点时间来学习 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
        }
    }

【讨论】:

  • 哈哈,我绝对打算!我只是在时间紧迫的情况下演示一个可行的解决方案,因为我也仅限于可以在他们的机器上使用的应用程序。我当然更喜欢使用 Python。也感谢您的回复,我将从这个开始并做更多的研究。您对书籍/资源有什么建议可以作为很好的起点吗?
  • 有很多学习方法。你只需要承诺你所做的事情。从 Microsoft Virtual Academy 和 YouTube 上的视频开始。只需在任一站点上搜索开始 PowerShell。阅读内置帮助文件。然后查看有关 Windows PowerShell Survival Guide 的 TechNet 博客,甚至查看类似此讨论的建议。 reddit.com/r/PowerShell/comments/7oir35/…
  • 感谢您的建议,我一定会研究这些以及我今天开始阅读的书。在承诺方面,我当然有能力,这只是一个循序渐进的学习过程,因为我只有空闲时间投入学习。我对这些可能性感到非常兴奋。
【解决方案2】:

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

$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

【讨论】:

  • 实际上你不需要 Select-Object 部分。无论如何,应该只有指定的属性。但如果它完成了这项工作 - 太好了。 :-D
  • 那我将不得不尝试删除该部分。上周我读过一篇不同的文章,说调用 Select-Object 会在导出时强制您希望列的顺序。这对数据库并不重要。我非常感谢帮助解决这个问题!
  • 如果你有一个相当最新版本的 Powershell,当你为你的Get-ChildItem 使用参数-File 时,你可以摆脱关于“容器”的Where-Object。如果您希望对象属性具有特定顺序,您可以使用加速器[ordered]。我更新了我的答案。
  • 抱歉耽搁了@Olaf,我确认我目前安装了 5.1 版。我刚刚进行了您建议的更改,并且效果很好!我确实有一个关于将此脚本生成的输出 CSV 导入 Access 中相应表的后续问题,但我可能应该将其作为一个单独的问题发布。到目前为止,我至少已经设法从 Access 中执行了这个脚本。
  • 我很高兴它有帮助。我希望 Access 能够自行导入有效的 CSV 文件。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2014-09-01
  • 2017-10-28
相关资源
最近更新 更多