相关疑难解决方法(0)

如何将多个参数传递到PowerShell中的函数?

如果我有一个接受多个字符串参数的函数,则第一个参数似乎获取分配给它的所有数据,其余参数作为空传入.

快速测试脚本:

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之间是一致的,所以很明显,我做错了.任何人都可以指出究竟是什么?

powershell

406
推荐指数
11
解决办法
55万
查看次数

什么是蟒蛇中的Truthy和Falsy?它与真与假有什么不同?

我刚刚才知道有TruthyFalsy在Python这是与正常不同的价值观TrueFalse

是否有人可以深入解释什么truthyfalsy值?

我应该在哪里使用它们?

truthyTrue值以及falsyFalse值之间有什么区别?

python

92
推荐指数
4
解决办法
3万
查看次数

管道完整的数组对象而不是一次一个数组项?

如何将一个CmdLet的输出作为完整的数组对象发送到管道中的下一个,而不是一次发送一个数组中的单个项目?

问题 - 通用描述
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)

arrays syntax powershell pipeline object

26
推荐指数
3
解决办法
3万
查看次数

多行正则表达式匹配配置块

我在尝试匹配文件中的某个配置块(多个配置块)时遇到了一些问题.下面是我试图从配置文件中提取的块:

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地址.如何跨多行匹配配置块?

regex powershell

23
推荐指数
2
解决办法
4万
查看次数

意外的ConvertTo-Json结果?答:它的默认深度为2

为什么我得到意想不到的ConvertTo-Json结果?
为什么往返($Json | ConvertFrom-Json | ConvertTo-Json)失败?

元问题

Stackoverflow有一个很好的机制来防止重复的问题,但是据我所知,还没有一种机制可以防止有重复原因的问题。以这个问题为例:几乎每个星期都有一个新的原因相同的问题出现,但是通常很难将其定义为重复问题,因为问题本身只是稍有不同。不过,如果这个问题/答案本身最终以重复(或题外话)结尾,我不会感到惊讶,但是不幸的是stackoverflow无法写一篇文章来防止其他程序员继续写这个“已知”陷阱引起的问题。

重复项

具有相同共同原因的类似问题的一些示例:

不同

那么,这个“自我回答”的问题是否与上述重复的问题有所不同?
它具有标题中的常见原因,因此可以更好地防止由于相同原因而重复问题。

powershell json depth convertto-json

10
推荐指数
2
解决办法
1343
查看次数

$null 应该在等式比较的左侧吗?(-eq 带数组)

和同事讨论,应该$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

10
推荐指数
1
解决办法
2866
查看次数

并非显示所有属性

当我们尝试通过管道将数据导出到其他函数时,我们在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.

arrays powershell properties

6
推荐指数
1
解决办法
618
查看次数

在Powershell中避免不可知的锯齿状阵列扁平化

我在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') )

有没有人遇到这个,有没有人解决这个问题?我知道我可以实例化框架对象,并且我假设如果我创建一个对象[],列表<>或其他类似的东西,一切都会好的,但我一直在处理这个问题.肯定似乎必须有一个正确的方法来做到这一点(无需实例化真正的框架对象).

代码示例1

function Display($x, [int]$indent, [string]$title)
{
  if($title -ne '') { write-host …
Run Code Online (Sandbox Code Playgroud)

arrays powershell jagged-arrays

5
推荐指数
1
解决办法
2783
查看次数

从函数返回多维数组

我在将现有的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".

arrays powershell multidimensional-array

5
推荐指数
1
解决办法
822
查看次数

PowerShell:将 16MB CSV 导入 PowerShell 变量会创建超过 600MB 的 PowerShell 内存使用量

我试图理解为什么当我导入一个大约 16MB 的文件作为变量时 PowerShell 的内存膨胀这么多。我可以理解围绕该变量存在额外的内存结构,但我只是想了解它为什么那么高。这是我在下面所做的 - 只是任何人都可以运行的另一个脚本的精简片段。

笔记/问题

  1. 不是抱怨,而是试图理解为什么使用如此多,以及是否有更好的方法来做到这一点或更有效地管理内存以尊重我正在运行的系统。
  2. 在 PowerShell 5.1 和刚刚发布的 PowerShell 7、RC3 中也会出现相同的行为。我不认为这是一个错误,只是让我了解更多信息的另一个机会。
  3. 我的总体目标是运行一个 foreach 循环来检查另一个小得多的数组是否与此数组匹配或缺少匹配。

我的测试代码

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

5
推荐指数
1
解决办法
854
查看次数