我有一个接受管道参数的脚本。 我无法确定用户是否已经通过Sort-Object传输了他们的输入,然后再切换到我的脚本,所以我想在我开始在我的脚本中对它进行操作之前发送管道输入以进行排序(以及其他处理)。 / p>
该脚本具有以下参数:
$script:creds
$script:confObj
function Get-ConfigureServerInput
{
<#
#>
[CmdletBinding(DefaultParameterSetName = "FromPipe")]
Param(
[Parameter(ParameterSetName="FromUser", Mandatory=$true, Position=0)] [string[]]$ComputerName,
[Parameter(ParameterSetName="FromUser", Mandatory=$true, Position=1)] [string[]]$AppName,
[Parameter(ParameterSetName="FromUser", Mandatory=$true, Position=2)] [string[]]$key,
[Parameter(ParameterSetName="FromUser", Mandatory=$true, Position=3)] [string[]]$setting,
[Parameter(ParameterSetName="FromPipe", Mandatory=$true, ValueFromPipeline=$true)] [PSObject]$pobj,
[Parameter(ParameterSetName="FromFile", Mandatory=$true)] [string]$File,
[Parameter()] [switch]$force,
[Parameter()] [switch]$mt,
[Parameter()] [int]$MaxThreads = 0,
[Parameter()] [System.Management.Automation.PSCredential]$Credentials
)
BEGIN
{
#Runs once regardless of how many items are in the pipe
If ($Credentials -ne $null) {$script:creds = $Credentials}
Switch ($PSCmdlet.ParameterSetName)
{
"FromPipe"
{
Write-Verbose "Input is from pipe"
$script:confObj = $($pobj)
break
}
"FromUser"
{
Write-Verbose "Input is from user arguments"
$uObj = New-Object PSObject
$uObj | Add-Member -type NoteProperty -name ComputerName -value $ComputerName
$uObj | Add-Member -type NoteProperty -name AppName -value $AppName
$uObj | Add-Member -type NoteProperty -name key -value $key
$uObj | Add-Member -type NoteProperty -name setting -value $setting
$script:confObj = $uObj
break
}
"FromFile"
{
Write-Verbose "Input is from file"
Write-Verbose "Import-CSV -Header 'ComputerName','AppName','key','setting' -path $File "
$script:confObj = Import-CSV -Header "ComputerName","AppName","key","setting" -path $File
break
}
}
$script:confObj
}
我认为我需要的是BEGIN块中的内容,如:
$input = $input | Sort-Object ComputerName,AppName,key,setting -Unique
但是BEGIN块中似乎没有$ input变量。如果我输入$输入| BEGIN块中的Get-Member我收到错误:
Get-Member : No object has been specified to the get-member cmdlet.
At E:\Powershell\ConfigureServer\ConfigureServer.psm1:53 char:22
+ $input | Get-Member <<<<
+ CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException
+ FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand
我可以将Sort-Object行放在PROCESS块中,但正如预期的那样,我一次得到一个对象,每个对象都会自行排序,从而产生非排序数据。
关于如何在我的脚本中处理它之前如何运行我的传入管道(例如:Sort-Object)的任何建议(除了依靠用户将Sort-Object的输出传递给我的脚本)?
这就是我将对象发送到我的脚本的方式:
Import-CSV -header "ComputerName","AppName","key","setting" duplicates.dat | Get-Member
这里显示Get-Member,看到我正在获取一个对象。
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AppName NoteProperty System.String AppName=garbage
ComputerName NoteProperty System.String ComputerName=google.com
key NoteProperty System.String key=trash
setting NoteProperty System.String setting=null
使用-File或-ComputerName(以及其他必需的args)调用它会产生一个我期待的对象。 e.g:
PS E:\Powershell\ConfigureServer> Get-ConfigureServerInput -Verbose -File duplicates.dat
VERBOSE: Input is from file
VERBOSE: Import-CSV -Header 'ComputerName','AppName','key','setting' -path duplicates.dat
ComputerName AppName key setting
------------ ------- --- -------
google.com garbage trash null
alpha nonsense nilhilist nil
yahoo.com aname akey avalue
alpha nonsense nilhilist nil
yahoo.com aname akey avalue
使用管道输入调用不会返回任何输出。
答案 0 :(得分:0)
您必须使用您声明的参数:$ComputerName
,$AppName
,$key
,$setting
。
您可以使用Add-Member
重建与原始对象类似的内容,然后对其进行排序。