- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个Powershell功能,在该功能中,我试图允许用户通过键入单词“add”或“remove”,然后以空格分隔的项目列表来从列表中添加或删除项目。我在下面有一个示例(略作编辑,因此您可以将代码放入powershell提示符中以对其进行“实时”测试)。
$Script:ServerList = @("Server01","Server02","Server03")
Function EditServerList (){
$Script:ServerList = $Script:ServerList |Sort -Unique
Write-host -ForegroundColor Green $Script:ServerList
$Inputs = $args
If ($Inputs[0] -eq "start"){
$Edits = Read-Host "Enter `"add`" or `"remove`" followed by a space-delimited list of server names"
#"# EditServerList $Edits
# EditServerList $Edits.split(' ')
EditServerList ($Edits.split(' ') |Where {$_ -NotLike "add","remove"})
EditServerList start
} Elseif ($Inputs[0] -eq "add"){
$Script:ServerList += $Inputs |where {$_ -NotLike $Inputs[0]}
EditServerList start
} Elseif ($Inputs[0] -eq "remove"){
$Script:ServerList = $Script:ServerList |Where {$_ -NotLike ($Inputs |Where {$_ -Notlike $Inputs[0]})}
EditServerList start
} Else {
Write-Host -ForegroundColor Red "ERROR!"
EditServerList start
}
}
EditServerList start
最佳答案
要预先解决标题的一般性问题,请执行以下操作:
$Args
接收包含整个数组的单个参数,因此您必须使用$Args[0]
来访问它。$Script:ServerList = @("Server01", "Server02", "Server03")
Function EditServerList () {
# Split the arguments, which are all contained in $Args[0],
# into the command (1st token) and the remaining
# elements (as an array).
$Cmd, $Servers = $Args[0]
If ($Cmd -eq "start"){
While ($true) {
Write-host -ForegroundColor Green $Script:ServerList
$Edits = Read-Host "Enter `"add`" or `"remove`" followed by a space-delimited list of server names"
#"# Pass the array of whitespace-separated tokens to the recursive
# invocation to perform the requested edit operation.
EditServerList (-split $Edits)
}
} ElseIf ($Cmd -eq "add") {
# Append the $Servers array to the list, weeding out duplicates and
# keeping the list sorted.
$Script:ServerList = $Script:ServerList + $Servers | Sort-Object -Unique
} ElseIf ($Cmd -eq "remove") {
# Remove all specified $Servers from the list.
# Note that servers that don't exist in the list are quietly ignored.
$Script:ServerList = $Script:ServerList | Where-Object { $_ -notin $Servers }
} Else {
Write-Host -ForegroundColor Red "ERROR!"
}
}
EditServerList start
"start"
分支内使用循环,以避免耗尽堆栈空间,如果继续递归,可能会发生这种情况。 $Cmd, $Servers = $Args[0]
将参数数组(包含在传递的一个且唯一的参数中,请参见下文)分解到第一个 token 中(命令字符串add
或remove
)和其余参数(服务器名称)的数组。$var1, $var2 = <array>
的标量)和其余元素(分配给$var1
的数组)的$var2
技术通常称为解构或拆包。它被记录在 Get-Help about_Assignment Operators
中,尽管没有给它起这样的名字。 -split $Edits
使用-split
运算符的方便的一元形式将用户输入分成由空格分隔的 token 数组,并将该数组传递给递归调用。EditServerList (-split $Edits)
传递一个作为数组的参数-这就是为什么必须使用$Args[0]
来访问它的原因。 -split
运算符(而不是.Split(' ')
)具有忽略开头和结尾空格以及忽略条目之间的多个空格的附加优点。-split
优于[string]
类型的.Split()
方法-请参阅我的this answer。 -notin
中使用包含运算符Where-Object { $_ -notin $Servers }
来接受数组作为RHS,以便从$Servers
所包含的服务器列表中筛选出值。 EditServerList ($Edits.split(' ') |Where {$_ -NotLike "add","remove"})
(a)错误地尝试从参数数组中删除命令名称,即使递归调用需要它也是如此,但(b)实际上却没有这样做,因为-like
的RHS不支持数组。 (顺便说一句:由于您正在查找确切的字符串,因此-eq
本来是更好的选择。)$Inputs[0]
实际上是指整个数组(命令名+服务器名),而不仅仅是它的第一个元素(命令名)。($Inputs[0] -eq "add")
,因为-eq
运算符(如果其LHS是数组)将执行数组过滤,并返回匹配元素的子数组。由于add
是元素中的一个,因此返回了一个1元素子数组,该子数组在 bool(boolean) 上下文中是“真实的”。 where {$_ -NotLike $Inputs[0]}
清除命令名的尝试失败了,并且add
没有删除-您实际上必须与$Inputs[0][0]
(原文如此)进行比较。 Where {$_ -NotLike ($Inputs |Where {$_ -Notlike $Inputs[0]})}
不能将任何内容过滤掉,原因如下:($Inputs |Where {$_ -Notlike $Inputs[0]})
始终返回一个空数组,因为-Notlike
的RHS是一个数组,如上所述,该数组不起作用。 Where {$_ -NotLike @() }
等效,该命令为LHS上的任何标量返回$True
。 Get-Help about_Splatting
)也适用于数组:
> function foo { $Args.Count } # function that outputs the argument count.
> foo @(1, 2) # pass array
1 # single parameter, containing array
> $arr = @(1, 2); foo @arr # splatting: array elements are passed as indiv. args.
2
@
而不是
$
作为中间变量的前缀才能执行飞溅。
关于powershell - 将单个以空格分隔的字符串作为多个参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227746/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!