标签: powershell-core

在Mac上的PowerShell上更新帮助

我是PowerShell的新手,我知道在Windows上的PowerShell上,您需要以管理员身份运行才能更新帮助文件,但是如何在Mac上的PowerShell上更新帮助文件?

macos powershell powershell-core

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

PowerShell Core 可以使用 Windows 终端而不是 pwsh.exe 控制台吗?

默认的 PowerShell Core (pwsh.exe) 控制台看起来就像命令提示符 (cmd.exe) 控制台。此外,PowerShell Core 控制台也有无法正确显示外文字符(例如韩语、日语等)的限制,除非我更改字体,但我不想这样做。另一方面,Windows 终端可以正确显示外来字符,因为它默认使用 UTF-8。

我使用 AutoHotKey 启动 PowerShell 脚本 (.ps1),我想知道是否可以在 Windows 终端中打开该脚本并自动使用 PowerShell Core?我需要执行任何配置更改吗?

powershell-core windows-terminal

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

如何将 AzureRm 模块与 PowerShell 7 一起使用?

语境

我刚刚安装了 PowerShell 7。我正在尝试运行经过工作测试的 Azure 相关脚本...因此我安装并导入了 AzureAd 和 AzureRM 模块。

当尝试登录其中一个Connect-AzureADConnect-AzureRmAccount两个时出现以下错误(继续阅读)

无法加载类型“System.Security.Cryptography.SHA256Cng”

好的,这是因为 Azure 模块正在寻找该 API,而该 API 在 .NET Core 中不可用,因此我将Import-Module-UseWindowsPowerShell参数一起使用,这解决了问题,但仅限于 AzureAD 模块

问题

对于该命令,Import-Module AzureRm -UseWindowsPowerShell我收到以下错误消息:

导入模块:无法为远程模块“AzureRM”生成代理。在远程会话中运行 Get-Command 命令未返回任何结果。

所以我仍然无法使用Connect-AzureRmAccount有什么想法吗?

powershell azure-powershell powershell-core

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

Powershell Core + Pester - 将测试与 src 分离

问题:

将函数导入到不在同一目录中的测试的最佳方法是什么?

例子

 src
       Get-Emoji.ps1
 test
       Get-Emoji.Tests.ps1
Run Code Online (Sandbox Code Playgroud)

因b4

  • Pester 文档[1] 建议将测试文件放置在与其测试的代码相同的目录中。没有提供替代方案的示例。
  • Pester 文档[2] 建议使用点源来导入文件。仅包含同一目录中的示例
  • 从 src 中进行测试是否是一种好的做法,将在其他地方讨论
  • 使用 Powershell Core 在不同操作系统文件系统上提供跨平台支持(正斜杠与反斜杠)

[1]文件放置和命名约定

Pester 认为所有名为 .Tests.ps1 的文件都是测试文件。这是几乎所有项目都使用的默认命名约定。

测试文件放置在与其测试的代码相同的目录中。每个文件都作为它测试的函数被调用。这意味着对于 Get-Emoji 函数,我们会将 Get-Emoji.Tests.ps1 和 Get-Emoji.ps1 放在同一目录中。将测试引用到 Pester 中的函数的最佳方式是什么?

[2]导入测试的函数

Pester 测试放置在 .Tests.ps1 文件中,例如 Get-Emoji.Tests.ps1。代码位于Get-Emoji.ps1中。

为了使测试代码可供测试,我们需要导入代码文件。这是通过将文件点源到当前范围来完成的,如下所示:

实施例1

# at the top of Get-Emoji.Tests.ps1
BeforeAll { 
    . $PSScriptRoot/Get-Emoji.ps1
}
Run Code Online (Sandbox Code Playgroud)

实施例2

# at the top of Get-Emoji.Tests.ps1
BeforeAll { 
    . $PSCommandPath.Replace('.Tests.ps1','.ps1')
}
Run Code Online (Sandbox Code Playgroud)

powershell unit-testing pester powershell-core

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

PowerShell Core 可以在 Linux 环境中处理带有 CRLF 行结尾的 ps1 文件吗?

我有以下未解答的问题,并且我正在寻找解释 Linux 环境中 LF 与 CRLF 行结尾的 PowerShell 核心要求的文档。

1- PWSH Core 可以处理带 CRLF 的文件吗?

2-当我运行以 LF 行结尾的 ps1 文件时,它可以调用另一个以混合 CRLF 行结尾的 ps1 文件吗?

3- PWSH 行结束要求是否已记录并在所有 Linux 发行版中保持一致?

我问上述问题是因为 PowerShell 诞生于 Windows 环境中,并且我希望它能够以某种方式容忍 LF 与 CRLF 的差异。

在线文档的链接将会有很大帮助。我进行了搜索,令人惊讶的是,我找不到任何东西。

linux powershell powershell-core

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

如何在 PowerShell 中隐藏 Get-Help 中的参数(不仅仅是制表符完成)?

我四处搜寻,找不到“否”的直接答案,但也没有找到“是”的直接答案。

我已经知道的:

  • [Parameter(DontShow)]只影响制表符完成
  • 一个建议是使用通用参数并测试它是否存在$PSBoundParameters- 虽然技术上可行,但这会产生副作用,即没有我想要的名称。
  • 另一个建议是将其作为别名隐藏在另一个参数中,但这更适合弃用。

我遇到的情况是有一个参数不应被任何第 3 方使用,但由配套脚本使用

例子:

[CmdletBinding(SupportsShouldProcess)]param(
  [switch]$VisibleSwitch,
  [switch]$HiddenSwitch ### This switch should not be visible to human-beings.
)
#...
if( $HiddenSwitch) {
  #do something
  return
}
#...
Run Code Online (Sandbox Code Playgroud)

powershell powershell-core

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

如果属性名称是整数,为什么我不能点引用哈希表键的值属性

考虑以下哈希表:

$table = @{
  6           = '10.11.12.13', '10.11.12.14'
  15          = 'domain.tld'
  NameServers = '10.11.12.13', '10.11.12.14'
}
Run Code Online (Sandbox Code Playgroud)

通常,当您有哈希表时,您可以引用.键名称以更加面向对象的方式使用它,而不是使用数组访问器语法[key]。例如,调用NameServers上面哈希表上的键并.返回值,我可以按预期使用该属性值的成员:

$table.NameServers       # ========> 10.11.12.13
                         # ========> 10.11.12.14

$table.NameServers.Count # ========> 2
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用包含相同字符串内容的6a 访问键,它会引用正确的值,但我无法调用返回对象上的任何成员。.必须在这里使用传统的数组访问器:

$table.6        # =====> 10.11.12.13
                # =====> 10.11.12.14

$table.6.Count  # =====> ParserError:
                # =====> Line |
                # =====>    1 |  $hi.6.Count
                # =====>      |      ~
                # =====>      | Missing property name after reference operator.

$table[6].Count # =====> …
Run Code Online (Sandbox Code Playgroud)

powershell powershell-core

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

与 PowerShell 5.1 相比,PowerShell 7.x 现在的功能是否完整?

当 PowerShell 6.x 首次推出时,与 PowerShell 5.1 相比,它的功能存在许多差距,因此,在具有风险意识的工作环境中使用 Windows Server 2012 和 2016 的任何人根本就从未接触过 6.x,而一直使用 PowerShell 5.1(包括我自己,我们没有选择在这些系统上安装 PowerShell 7.x,因为风险团队的工作是阻止所有进展(开玩笑,但有时感觉就是这样))。

我很好奇 PowerShell 7.x 现在是否被认为是“功能完整”,因为如果我在 PowerShell 5.x 中编写一个脚本,然后尝试将该脚本移植到 7.x(当然在同一操作系统上),将会这一切都有效吗?如果不是,哪些特定领域会失败,但仍然在“待办事项列表”上,以使 7.x 功能与 5.1 一起完善?例如,哪些 5.1 cmdlet 将始终无法在 7.x 环境中运行,以及其他类似的情况。

我个人希望看到像 7.x 这样的开发环境成为我们所有人都可以瞄准的 Windows 标准;5.1 有一些问题,并且多年来一直“停滞不前”,甚至像启动时间这样的事情也是我一直在努力解决的问题,因为 5.1 可能需要 2-3 秒才能启动控制台或任何脚本(即使使用-NoProfile或ngen编译优化),但我认为PowerShell 7.x在Windows 11中不是默认的(我没有它,但谷歌搜索似乎“停滞”5.1仍然是默认的),所以它仍然会是再过 5 年,我们就会看到 PowerShell 7.x 作为某些未来版本(可能是 Windows 12 / Windows Server 2027)的默认版本?

powershell powershell-core

5
推荐指数
0
解决办法
526
查看次数

PowerShell Start-Process -Wait 不等待 VS Code

在 PowerShell Core 中,像这样生成 VS Code,以启动差异/合并:

Start-Process -FilePath "$([System.Environment]::GetEnvironmentVariable('LOCALAPPDATA'))\\Programs\\Microsoft VS Code\\code.exe" -Wait -ArgumentList "-n --diff $FullFileNameSrcFrom $FullFileNameSrcTo"
Run Code Online (Sandbox Code Playgroud)

有效,但它不会等待。我认为这是因为 code.exe 启动子进程。如果是这种情况,我可以使用-Passthru并执行类似的操作:

Get-Process *some criteria here* | ... and check if the children processes are finished
Run Code Online (Sandbox Code Playgroud)

但是:标准是什么?

我曾经procexp试图找出它,但没有成功。

如何识别代码生成的进程?

也许有更简单的方法?

我使用 git 和 VS Code 作为默认提交编辑器,显然 git 会等待 VS Code 终止后再继续 - 所以“他们”找到了一种方法来做到这一点。这给我/你一个提示吗?

powershell wait visual-studio-code powershell-core

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

为什么 -ErrorAction Stop / $ErrorActionPreference = 'Stop' 有时无效,例如使用隐式远程处理/Windows PowerShell 兼容性?

这个自我回答的问题是从 PowerShell (Core) v7.3.x 开始编写的,旨在解决以下症状:

有时,使用或似乎都无法有效地通过/语句捕获和处理错误。-ErrorAction -Stop$ErrorActionPreference = 'Stop'trycatch

这是两个例子:

  • Get-NetAdapter$ErrorActionPreference = 'Stop' 从脚本或函数中忽略(从全局范围以外的范围):

    # Run on Windows. Affects both PowerShell editions.
    # The `catch` block isn't triggered, and the (still non-terminating) error prints.
    & { # Simulate running in a child scope.
      $ErrorActionPreference = 'Stop'
      try {     
        Get-NetAdapter nosuch 
      }
      catch {
        "Should get here, but don't."
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 然而,使用-ErrorAction Stop( Get-NetAdapter nosuch -ErrorAction Stop …

error-handling powershell powershell-remoting powershell-core

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