如果我有一个接受多个字符串参数的函数,则第一个参数似乎获取分配给它的所有数据,其余参数作为空传入.
快速测试脚本:
Function Test([string]$arg1, [string]$arg2)
{
Write-Host "`$arg1 value: $arg1"
Write-Host "`$arg2 value: $arg2"
}
Test("ABC", "DEF")
Run Code Online (Sandbox Code Playgroud)
生成的输出是
$arg1 value: ABC DEF
$arg2 value:
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是:
$arg1 value: ABC
$arg2 value: DEF
Run Code Online (Sandbox Code Playgroud)
这似乎在多台机器上的v1和v2之间是一致的,所以很明显,我做错了.任何人都可以指出究竟是什么?
我刚刚才知道有Truthy和Falsy在Python这是与正常不同的价值观True和False?
是否有人可以深入解释什么truthy和falsy值?
我应该在哪里使用它们?
truthy和True值以及falsy和False值之间有什么区别?
问题 - 通用描述
在about_pipelines(help pipeline)的帮助中可以看到,powershell在管道¹下发送一个对象.因此Get-Process -Name notepad | Stop-Process,在管道下方发送一个进程.
假设我们有第三方CmdLet(Do-SomeStuff)无法以任何方式修改或更改.如果传递一个字符串数组或传递一个字符串对象,则Do-SomeStuff执行不同的操作.
DO-SomeStuff仅仅是一个例子,它可以被取代ForEach-Object,Select-Object,Write-Host(或任何其它小命令接受管道输入)
Do-SomeStuff将在此示例中一次处理数组中的各个项目.
$theArray = @("A", "B", "C")
$theArray | Do-SomeStuff
Run Code Online (Sandbox Code Playgroud)
如果我们想将完整数组作为一个对象发送到Do-SomeStuff,可能会尝试这样的事情
@($theArray) | Do-SomeStuff
Run Code Online (Sandbox Code Playgroud)
但由于PowerShell"忽略"了新的单项数组,因此它不会产生预期的结果.
那么,你如何"强制" $theArray作为单个数组对象传递给管道而不是当时的内容项?
问题 - 实际示例
如下所示,Write-Host如果传递一个数组或者它一次传递一个数组中的单个项,则输出是不同的.
PS C:\> $theArray = @("A", "B", "C")
PS C:\> Write-Host $theArray
A B C
PS C:\> $theArray | foreach{Write-Host $_}
A
B
C
PS C:\> @($theArray) | foreach{Write-Host $_}
A
B …Run Code Online (Sandbox Code Playgroud) 我在尝试匹配文件中的某个配置块(多个配置块)时遇到了一些问题.下面是我试图从配置文件中提取的块:
ap71xx 00-01-23-45-67-89
use profile PROFILE
use rf-domain DOMAIN
hostname ACCESSPOINT
area inside
!
Run Code Online (Sandbox Code Playgroud)
有这样的多个,每个都有不同的MAC地址.如何跨多行匹配配置块?
为什么我得到意想不到的ConvertTo-Json结果?
为什么往返($Json | ConvertFrom-Json | ConvertTo-Json)失败?
Stackoverflow有一个很好的机制来防止重复的问题,但是据我所知,还没有一种机制可以防止有重复原因的问题。以这个问题为例:几乎每个星期都有一个新的原因相同的问题出现,但是通常很难将其定义为重复问题,因为问题本身只是稍有不同。不过,如果这个问题/答案本身最终以重复(或题外话)结尾,我不会感到惊讶,但是不幸的是stackoverflow无法写一篇文章来防止其他程序员继续写这个“已知”陷阱引起的问题。
具有相同共同原因的类似问题的一些示例:
那么,这个“自我回答”的问题是否与上述重复的问题有所不同?
它具有标题中的常见原因,因此可以更好地防止由于相同原因而重复问题。
和同事讨论,应该$null在支票的左边还是右边?为什么这很重要的任何例子?
$abc = $null
$null -eq $abc
True
$abc -eq $null
True
Run Code Online (Sandbox Code Playgroud)
一切都好
$abc = 6,7,$null,8,9
$null -eq $abc
False
$abc -eq $null
*No output*
Run Code Online (Sandbox Code Playgroud)
有人可以解释比较数组时发生了什么吗?
当我们尝试通过管道将数据导出到其他函数时,我们在PowerShell中观察到一些奇怪的行为.
示例代码:
$Array = @()
$Obj1 = [PSCustomObject]@{
Member1 = 'First'
Member2 = 'Second'
}
$Obj2 = [PSCustomObject]@{
Member1 = 'First'
Member2 = 'Second'
Member3 = 'Third'
}
$Array = $Obj1, $Obj2
$Array | Out-GridView -Title 'Not showing Member3'
$Array = $Obj2, $Obj1
$Array | Out-GridView -Title 'All members correctly displayed'
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,您可以看到当第一个对象仅包含2时properties,Out-GridViewCmdLet(和其他)仅显示2 properties,即使第二个对象具有3 properties.但是,当数组中的第一个对象有3时,properties它会正确地显示它们.
有没有解决的办法?因为不可能预先properties确定一个物体上有多少物体,并且物体中最多的物体properties将是第一个物体array.
我在Powershell中遇到了一个有趣的问题,并且无法找到解决方案.当我谷歌(并找到像这篇文章的东西)时,没有任何涉及我正在尝试做的事情,所以我想我会在这里发布问题.
问题与外部数组长度为1的多维数组有关.似乎Powershell非常坚持像@( @('A') )变为扁平化阵列一样@( 'A' ).这是第一个片段(提示符是>,顺便说一句):
> $a = @( @( 'Test' ) )
> $a.gettype().isarray
True
> $a[0].gettype().isarray
False
Run Code Online (Sandbox Code Playgroud)
所以,我希望$a[0].gettype().isarray是真的,所以我可以将值索引为$a[0][0](真实场景是在循环内处理动态数组,我想得到值$a[$i][$j],但如果内部项是不被识别为数组但作为字符串(在我的情况下),您开始索引字符串的字符,如在$a[0][0] -eq 'T').
我有几个很长的代码示例,所以我最后发布了它们.并且,作为参考,这是在安装了PSv2和PSCX的Windows 7旗舰版上.
考虑代码示例1:我使用+ =运算符手动构建一个简单的数组.中间阵列$w是扁平的,因此不会正确地添加到最终阵列中.我已经在网上找到类似问题的解决方案,基本上是在内部数组之前插入一个逗号来强制外部数组不会变平,这确实有效,但同样,我正在寻找一种可以在循环内构建数组的解决方案(一个锯齿状的数组数组,处理一个CSS文件),所以如果我将前导逗号添加到单个元素数组(实现为中间数组$y),我想对其他数组(如$z)做同样的事情,但这会产生负面影响如何$z添加到最终数组.
现在考虑代码示例2:这更接近我遇到的实际问题.当从函数返回具有一个元素的多维数组时,它将被展平.它离开函数之前是正确的.再一次,这些都是例子,我真的试图处理一个文件,而不必知道该函数是否会回来@( @( 'color', 'black') )或与@( @( 'color', 'black'), @( 'background-color', 'white') )
有没有人遇到这个,有没有人解决这个问题?我知道我可以实例化框架对象,并且我假设如果我创建一个对象[],列表<>或其他类似的东西,一切都会好的,但我一直在处理这个问题.肯定似乎必须有一个正确的方法来做到这一点(无需实例化真正的框架对象).
function Display($x, [int]$indent, [string]$title)
{
if($title -ne '') { write-host …Run Code Online (Sandbox Code Playgroud) 我在将现有的vbs脚本转换为PowerShell脚本时遇到了一些问题.我在这里用一些虚拟代码而不是原始代码来说明.在例1中,我在数组中只有1组元素,在将数组变量返回给函数时,它只会显示P.
但是在示例2中,我在数组中有2组元素,在将数组变量返回给函数时,它将正确显示元素.
如果在示例1和2中的函数内打印数组,则获取结果没有任何问题.
我用谷歌搜索,无法找到任何解决方案.非常感谢您的帮助.
例1:
function testArray {
$array1 = @()
$array1 += ,@("Apple","Banana")
return $array1
}
$array2 = testArray
Write-Host $array2[0][1]
Run Code Online (Sandbox Code Playgroud)
结果是"P".
例2:
function testArray {
$array1 = @()
$array1 += ,@("Apple","Banana")
$array1 += ,@("Orange","Pineapple")
return $array1
}
$array2 = testArray
Write-Host $array2[0][0]
Run Code Online (Sandbox Code Playgroud)
结果是"Apple".
我试图理解为什么当我导入一个大约 16MB 的文件作为变量时 PowerShell 的内存膨胀这么多。我可以理解围绕该变量存在额外的内存结构,但我只是想了解它为什么那么高。这是我在下面所做的 - 只是任何人都可以运行的另一个脚本的精简片段。
笔记/问题
我的测试代码
Invoke-WebRequest -uri "http://s3.amazonaws.com/alexa-static/top-1m.csv.zip" -OutFile C:\top-1m.csv.zip
Expand-Archive -Path C:\top-1m.csv.zip -DestinationPath C:\top-1m.csv
$alexaTopMillion = Import-Csv -Path C:\top-1m.csv
Run Code Online (Sandbox Code Playgroud)
对任何回答这个问题的人:感谢您的时间并帮助我每天学习更多!
memory powershell memory-profiling pscustomobject import-csv
powershell ×9
arrays ×4
depth ×1
import-csv ×1
json ×1
memory ×1
object ×1
pipeline ×1
properties ×1
python ×1
regex ×1
syntax ×1