小编Pau*_*l π的帖子

如何强制 Powershell 脚本运行特定版本

我的计算机上同时安装了 PowerShell 5.1 和 PowerShell 7.0。如何为给定脚本(在本例中为 PowerShell 7.0)强制执行 PowerShell 的强制版本(特定版本,而不是最低或最高版本)?

shell powershell powershell-core

5
推荐指数
2
解决办法
9938
查看次数

在 .ForEach() 方法中使用 continue/return 语句 - 使用 foreach ($item in $collection) 是否更好?

有相当详细的记录表明,foreach 处理速度根据 foreach 循环的执行方式而变化(从最快到最慢排序):

  1. .ForEach() 方法
  2. foreach($collection 中的$item){}
  3. $收藏| ForEach-对象{}


  • 当处理(非常)大的集合时,#1 和#2 之间的速度比较可能很重要,并且管道的开销使得#3 在这些情况下不适合。
  • #2 提供了该continue声明,而 #1 没有
    • 如果不准确,请纠正/评论
  • 从我在网上和现实生活中看到的,return是如何“continue使用”.ForEach()方法时。



我的问题:

  1. 当该方法的速度优势.ForEach()太大而难以满足foreach而您又需要时,正确的使用continue方法是什么?continue.ForEach({})
  2. return在方法内部使用时,您应该注意哪些含义或陷阱.ForEach()

powershell foreach loops continue return

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

如何确定给定的 PSProvider 是否使用变量语法,例如 $env:

简而言之,有没有办法从 shell 确定PSProvider 的路径是否有伴随变量,如果有,该变量的名称是什么?此处列出了支持此表示法的内置 PowerShell 提供程序,但我指的是一般提供程序 - 内置/第三方/自定义等。提供程序的驱动器名称(可以通过Get-PSProvider) 总是与其变量符号名称相同?


例如:

  • 环境提供程序使用Env:也可以使用其变量访问的驱动器$env:

  • 证书提供程序使用的Cert:驱动器也可以使用其变量进行访问$cert:,但没有实现IContentCmdletProvider 接口 - 如引用路径时在 shell 中触发的以下错误消息所示$Cert:xyz(但我可以使用CTRL+Spacetab自动完成$cert:路径)

    提供程序“证书”不能用于使用变量语法获取或设置数据。无法使用接口。该提供程序未实现 IContentCmdletProvider 接口。


这(下面引用)是否意味着每个提供程序的驱动器自动使用变量符号(并且始终具有相应的变量),但并非所有提供程序驱动器都能够通过提供程序的变量语法公开/操作其内容/项目?

“您可以使用美元 ($) 符号为提供程序路径添加前缀,并访问实现 IContentCmdletProvider 接口的任何提供程序的内容。”


最后,以下说法是否准确?
询问“是否有办法从 shell 确定 PSProvider 是否实现了IContentCmdletProvider接口?” 可能不足以确定是否可以使用其变量符号来访问/操作提供者的驱动器内容。

powershell

4
推荐指数
1
解决办法
123
查看次数

为什么 $null 在 ForEach-Object {} 与 foreach() 中的行为不同?

考虑以下示例:

\n

$null

\n
foreach ($n in $null) {'This is a $null test'}\n(no output)\n\n$null | ForEach-Object {'This is a $null test'}\nThis is a $null test\n\n$null -in $null\nTrue\n\n$null -contains $null\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xa0\n

\n

[int]1

\n
foreach ($n in [int]1) {'Test'}\nTest\n\n[int]1 | ForEach-Object {'Test'}\nTest\n\n[int]1 -in [int]1\nTrue\n\n[int]1 -contains [int]1\nTrue\n
Run Code Online (Sandbox Code Playgroud)\n


\n由于 $null 是一个不包含任何内容的标量值,因此在第二个 $null 示例中,$null 将沿着管道发送一个“nothing”的单个实例,这解释了输出。

\n

$null为什么即使$null -in $null返回也不能作为集合进行迭代True作为集合进行迭代?

\n
    \n
  • 性能增益不来自似乎是显而易见的,但为什么 PowerShell 将标量变量/值视为集合?
  • \n
  • 此行为是否在整个 .NET 和 .NET Framework 中持续存在?
  • \n
  • 是否发生了类型强制,或者我对集合/列表的结构或行为方式有根本性的误解吗?
  • \n
\n

.net powershell scalar null

4
推荐指数
1
解决办法
109
查看次数

PowerShell - 我可以使参数集依赖于另一个参数的值吗?

假设我有一个类似的函数:

function Authenticate
{
    param
    (
        [ValidateSet('WindowsAuthentication','UsernameAndPassword')]
        [string]$AuthenticationType,

        [Parameter(ParameterSetName='ParamSet1')]
        [string]$Username,

        [Parameter(ParameterSetName='ParamSet1')]
        [string]$Password
    )
  ..
}
Run Code Online (Sandbox Code Playgroud)

我想执行这些规则:

  • ParamSet1如果出现以下情况,则强制设置参数$AuthenticationType = 'UsernameAndPassword'
  • 完全“禁用”ParamSet1如果$AuthenticationType = 'WindowsAuthentication'

这可能吗?

powershell parameter-sets dynamicparameters

2
推荐指数
1
解决办法
6430
查看次数