【问题标题】:Choose which CSV to import when running a PowerShell script在运行 PowerShell 脚本时选择要导入的 CSV
【发布时间】:2022-10-23 07:58:35
【问题描述】:

我每周都会收到一份 CSV,我们的财务团队会将其放入共享驱动器中。我有一个用于该 CSV 的脚本,一旦我得到它就会运行。

脚本的第一个命令当然是Import-Csv

问题是,财务团队每次都坚持以不同的方式命名文件,而且他们并不总是将其放在驱动器内的同一位置。

结果,我必须先寻找文件,将其放入脚本指向的目录中,然后重命名文件。

我曾尝试与团队讨论将其放在同一位置并确保文件名相同,但他们只遵循说明几个星期,然后才开始做任何事情。

理想情况下,我希望这样当我运行脚本时,会有一个弹出窗口要求我选择一个 CSV(类似于在 Office 文档上执行“另存为”时的外观)。

无论如何要在PowerShell中完成?

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    您可以访问 .Net 类并与表单库进行接口,以实例化并从标准 FileOpen 对话框获取输入。如下所示:

    Using Namespace System.Windows.Forms
    
    $FileBrowser = [OpenFileDialog]::new()
    $FileBrowser.InitialDirectory = 'c:	emp'
    $FileBrowser.Filter = 'Comma Separated Values (*.csv) | *.csv'
    [Void]$FileBrowser.ShowDialog()
    
    $CsvFile = $FileBrowser.FileName
    

    然后在Import-Csv 命令中使用$CsvFile

    您可以更改.InitialDirectory 属性以使导航更方便一些。

    使用 .Filter 属性将文件打开显示限制为 CSV 文件,让事情变得更加方便。

    此外,使用[Void] 类来防止状态返回(通常是“OK”或“Cancel”)回显到屏幕上。

    注意:一个简单的谷歌搜索会出现很多例子。我改进了here 的一些工作。如果您想探索等,这还将记录一些其他属性。

    【讨论】:

    • 嗨史蒂夫,只是为了让你知道这很好用。最终不得不将 Add-Type -AssemblyName System.Windows.Forms 添加到第二行,但在那之后,一切都完美了!谢谢你。
    • 我很高兴听到它成功了。我在发布之前不久测试了代码并且不需要Add-Type,但是没有任何危害,这就是 cmdlet 的用途。 Using 文档还建议Add-Type 功能满足Using。但是,我对Using 语句/指令的主要兴趣是缩短类型引用的能力。使用Add-Type 可能会有优势,比如更好的错误处理可能性。在权衡UsingImport-Module 的使用时,我认为这是正确的。该 cmdlet 提供了更多的灵活性等...
    【解决方案2】:

    如果您愿意接受看起来不如“另存为”对话框的选择框,可以使用Out-Gridview。这些方面的东西可能会有所帮助。

    $filenames =
         @(Get-ChildItem -Path C:	emp -Recurse -Filter  *.csv  |
             Sort-Object LastWriteTime -Descending |
             Out-GridView -Title 'Choose a file' -PassThru)
    
    $csvfile = $filenames[0].FullName
    
    Import-Csv $csvfile | More
    

    -Path 指定一个目录,其中包含您的 csv 文件可能被传送到的所有位置。排序只是将最近写入的文件放在网格的顶部。据说这使选择更容易。 @() 包装器仅确保存储在 $filenames 中的结果是一个数组。

    你会用Import-Csv 的结果做其他事情。

    【讨论】:

      【解决方案3】:

      Steven 的回答肯定满足了您最初的问题,但另一种选择是让 PowerShell 完成这项工作。如果您知道驱动器,并且您知道本周文件的名称,您可以将名称传递给您的脚本,让它搜索您需要的特定 csv 文件的驱动器过滤。使其递归,并打开唯一匹配的文件。抱歉,昨天没有时间包含代码。当提供顶级搜索路径和带有可能通配符的文件名时,这是一个返回完整文件路径的函数。

      函数 gfp { $result=gci $args[0] -recurse -include $args[1];返回 ($result.DirectoryName + "" + $result.Name) }

      例子:gfp "d: ootfolder" "thisweeksfilename.csv"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        相关资源
        最近更新 更多