在Import-Csv上选择文件

时间:2018-06-30 09:17:20

标签: file powershell path

下面的代码是开关的一部分,它可以正常工作,但是问题是:我需要将文件名更改为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
}

3 个答案:

答案 0 :(得分:3)

因此,您需要在脚本中使用Intellisense。雄心勃勃的举动。大多数人会为file browser dialog box感到满意。无论如何,我将不得不把你推荐给比我聪明的人。我以为ValidateSet属性可以满足您的目的,但我意识到传统的param块还不够。所以我抬起头来DynamicParams,这就是我所发现的。这应该对您有用。

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

答案 1 :(得分:0)

下面是我用来编写1-off脚本的example.ps1文件。就您而言,我想您可以得到想要的东西。例如(不需要双关语),您可以通过键入

来调用此脚本
C:\PathToYourScripts\example.ps1 [tab]

其中[tab]表示按下Tab键。 Powershell intellisense将开始使用并为文件名提供自动补全功能。如果您的.csv文件不在当前目录中,则可以轻松地使用Powershell intellisense帮助您找到它

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]。请注意,将参数保留为空白不会破坏脚本,但是您可以扩展它以标记所需的参数,也可以通过一条有用的消息失败。这似乎超出了最初的问题,所以我在这里停止。

答案 2 :(得分:0)

最简单的解决方案是通过声明参数 ,使脚本将目标文件作为参数接受:

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的选项卡补全默认是在当前位置补全文件和目录名称,以便:

./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文件中循环(如果有)。

注意:看来,用Tab键填充没有候选补全的 empty 参数(在这种情况下,不存在*.csv文件)会退回到默认的文件名和目录名完成。

类似地,

./someScript 1<tab>

将仅在名称为*.csv开头的当前目录中的1个文件中循环。


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


PSv4-中,您有两个(繁琐的)自定义标签补全选项:

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

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