【问题标题】:Select file on Import-Csv在 Import-Csv 上选择文件
【发布时间】:2018-12-09 08:16:46
【问题描述】:

下面的代码是开关的一部分,它工作正常,但问题是:我需要将我的文件名更改为 15... 是否可以更改它,以便当我启动它时,它会等待使用 tab 键选择文件?就像您在 PowerShell 控制台中编写 Import-Csv 并按 Tab 时一样,它会显示所有可能的路径和文件。

$names = Import-Csv 15.csv -Header Givenname,Surname -Delimiter ";"
Write-Host "Rename your csv file to '15' and put it in same folder with this script" -ForegroundColor Cyan 
pause
foreach ($Name in $Names) {
    $FirstFilter = $Name.Givenname
    $SecondFilter = $Name.Surname
    Get-ADUser -Filter {GivenName -like $FirstFilter -and Surname -like $SecondFilter} |
        select Enabled, SamAccountName, DistinguishedName,
            @{n="ou";e={($_.DistinguishedName -split ",*..=")[2]}} |
        Export-Csv .\sam.csv -NoTypeInformation -Append
}

【问题讨论】:

标签: file powershell path


【解决方案1】:

因此,您需要在脚本中使用 Intellisense。雄心勃勃的举动。大多数人会选择file browser dialog box。无论如何,我将不得不向你推荐比我更聪明的人。我在想ValidateSet 属性可以满足您的目的,但我意识到传统的param 块是不够的。所以我查了DynamicParams,这就是我发现的。这应该适合你。

https://blogs.technet.microsoft.com/pstips/2014/06/09/dynamic-validateset-in-a-dynamic-parameter/

【讨论】:

  • 使用目录Name 而不是FullName 填充DynamicParams 会使IMO 更有意义。好发现+1。 OTOH,我认为 OP 在选择带有 TAB maybe this 的文件夹时还有其他想法
  • 在脚本内部,用户输入是通过Read-hostparam()实现的。 AFAIK,Read-Host 将期待用户的输入。它没有给出任何提示或建议。所以Param() 是我能想到的下一个最佳选择。至少它有途径提供类似智能感知的东西。我可能是错的,这就是为什么,我会让更聪明的人铺路。
  • 在 PSv5+ 中,您可以在 param() 块内的各个参数上使用 [ArgumentCompleter({...})] 属性。
  • 似乎是正确的答案...我会尝试一下..但不确定如何在我的代码中使用它
  • Technet 链接已损坏。我们有替代方案,还是文章的文字?
【解决方案2】:

下面是我用来编写 1-off 脚本的 example.ps1 文件。在你的情况下,我认为你可以得到你想要的。例如(没有双关语)您可以通过键入来调用此脚本

C:\PathToYourScripts\example.ps1 [tab]

其中[tab] 表示按下Tab 键。 Powershell 智能感知将启动并为文件名提供自动完成功能。如果您的 .csv 文件不在当前导向器中,您可以轻松使用 Powershell 智能感知来帮助您找到它

C:\PathToYourScripts\example.ps1  C:\PathToCSvFiles[tab]

powershell 将自动完成。可能会被否决的人可能会注意到 powershell 自动完成绝对不是一个完整的文件选择器,但这似乎满足了所提问题的意图。这是示例。

<#
.NOTES
    this is an example script
.SYNOPSIS
    this is an example script
.DESCRIPTION
    this is an example script

.Example
    this is an example script
.LINK
    https://my/_git/GitDrive
#>
[CmdletBinding(SupportsShouldProcess=$True, ConfirmImpact="Low")]
param (
      [string] $fileName
)
Begin {
}

Process {
    if ($PSCmdlet.ShouldProcess("Simulated execution to process $($fileName):  Omit -Whatif to process ")) {
       Write-Information -Message "Processing $fileName" -InformationAction Continue
    }
}

End {
}

如果您想获得多个参数的自动完成帮助,只需输入参数名称并在每个参数后按 [tab]。请注意,将参数留空不会破坏脚本,但您可以扩展它以标记所需的参数,或者只是失败并显示有用的消息。这似乎超出了最初的问题,所以我会在这里停下来。

【讨论】:

    【解决方案3】:

    最简单的解决方案是通过声明一个参数,让您的脚本接受目标文件作为参数

    param(
      # Declare a mandatory parameter to which the file path of the CSV
      # file to import must be passed as an argument on invocation.
      [Parameter(Mandatory)]
      [string] $FilePath
    )
    
    $names = Import-Csv $FilePath -Header Givenname,Surname -Delimiter ";"
    foreach ($Name in $Names) {
        $FirstFilter = $Name.Givenname
        $SecondFilter = $Name.Surname
        Get-ADUser -Filter {GivenName -like $FirstFilter -and Surname -like $SecondFilter} |
            select Enabled, SamAccountName, DistinguishedName,
                @{n="ou";e={($_.DistinguishedName -split ",*..=")[2]}} |
            Export-Csv .\sam.csv -NoTypeInformation -Append
    }
    

    如果您调用脚本没有文件路径,您将被提示;假设您的脚本位于当前目录中。它的名字是someScript.ps1:

    ./someScript    # invocation with no argument prompts for a value for $FilePath
    

    不幸的是,这样的自动提示对用户不友好,并且没有选项卡补全

    然而,在命令行上 PowerShell的tab补全默认是补全当前位置的文件名和目录名,所以: p>

    ./someScript <press tab here>
    

    循环浏览当前文件夹中的所有文件和目录。

    如果您不知道完整的文件名或不想完整输入,您甚至可以输入通配符表达式并用制表符完成

    ./someScript *.csv<press tab here>
    

    这将遍历当前目录中的所有*.csv 文件。仅限。

    如果您想更进一步并自定义选项卡完成以仅循环浏览 *.csv 文件,您可以使用 [ArgumentCompleter({ ... })] 属性 (PSv5+):

    param(
      [Parameter(Mandatory)]
      # Implement custom tab-completion based on only the *.csv files in the current dir.  
      [ArgumentCompleter({
        param($cmd, $param, $wordToComplete)
        Get-ChildItem -Name "$wordToComplete*.csv"
      })]
      [string] $FilePath
    )
    
    # ...
    

    现在,

    ./someScript <tab>
    

    将仅循环浏览当前目录中的 *.csv 文件(如果有)。

    警告:从 PowerShell 7.0 开始,使用制表符完成 ArgumentCompleter 脚本块返回的参数不匹配(在这种情况下,没有 *.csv文件)意外回退到默认的文件名和目录名完成 - 请参阅this GitHub issue

    同样,

    ./someScript 1<tab>
    

    将仅循环浏览当前目录中名称以1 开头的*.csv 文件(如果有)。


    作为将属性用作脚本/函数定义的一部分的替代方法,您可以使用 PSv5+ Register-ArgumentCompleter cmdlet 将制表符补全附加到 任何 命令的参数,即,包括先前存在的。


    PSv4- 中,您有两个(繁琐的)选项用于自定义选项卡完成:

    • 使用带有动态构造的[ValidateSet()] 属性的动态参数 - 请参阅Rohin Sidharth's answer 中的链接。

    • 自定义tabexpansion2(PSv3、PSv4)/tabexpansion(PSv1、PSv2)功能,但注意不要意外替换现有功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多