下面的代码是开关的一部分,它可以正常工作,但是问题是:我需要将文件名更改为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
}
答案 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)功能,但请确保不要意外替换现有功能。