我是PowerShell的新手,我知道在Windows上的PowerShell上,您需要以管理员身份运行才能更新帮助文件,但是如何在Mac上的PowerShell上更新帮助文件?
默认的 PowerShell Core (pwsh.exe) 控制台看起来就像命令提示符 (cmd.exe) 控制台。此外,PowerShell Core 控制台也有无法正确显示外文字符(例如韩语、日语等)的限制,除非我更改字体,但我不想这样做。另一方面,Windows 终端可以正确显示外来字符,因为它默认使用 UTF-8。
我使用 AutoHotKey 启动 PowerShell 脚本 (.ps1),我想知道是否可以在 Windows 终端中打开该脚本并自动使用 PowerShell Core?我需要执行任何配置更改吗?
语境
我刚刚安装了 PowerShell 7。我正在尝试运行经过工作测试的 Azure 相关脚本...因此我安装并导入了 AzureAd 和 AzureRM 模块。
当尝试登录其中一个Connect-AzureAD或Connect-AzureRmAccount两个时出现以下错误(继续阅读)
无法加载类型“System.Security.Cryptography.SHA256Cng”
好的,这是因为 Azure 模块正在寻找该 API,而该 API 在 .NET Core 中不可用,因此我将Import-Module与-UseWindowsPowerShell参数一起使用,这解决了问题,但仅限于 AzureAD 模块
问题
对于该命令,Import-Module AzureRm -UseWindowsPowerShell我收到以下错误消息:
导入模块:无法为远程模块“AzureRM”生成代理。在远程会话中运行 Get-Command 命令未返回任何结果。
所以我仍然无法使用Connect-AzureRmAccount有什么想法吗?
将函数导入到不在同一目录中的测试的最佳方法是什么?
例子
src
Get-Emoji.ps1
test
Get-Emoji.Tests.ps1
Run Code Online (Sandbox Code Playgroud)
[2]导入测试的函数Pester 认为所有名为 .Tests.ps1 的文件都是测试文件。这是几乎所有项目都使用的默认命名约定。
测试文件放置在与其测试的代码相同的目录中。每个文件都作为它测试的函数被调用。这意味着对于 Get-Emoji 函数,我们会将 Get-Emoji.Tests.ps1 和 Get-Emoji.ps1 放在同一目录中。将测试引用到 Pester 中的函数的最佳方式是什么?
Pester 测试放置在 .Tests.ps1 文件中,例如 Get-Emoji.Tests.ps1。代码位于Get-Emoji.ps1中。
为了使测试代码可供测试,我们需要导入代码文件。这是通过将文件点源到当前范围来完成的,如下所示:
实施例1
Run Code Online (Sandbox Code Playgroud)# at the top of Get-Emoji.Tests.ps1 BeforeAll { . $PSScriptRoot/Get-Emoji.ps1 }实施例2
Run Code Online (Sandbox Code Playgroud)# at the top of Get-Emoji.Tests.ps1 BeforeAll { . $PSCommandPath.Replace('.Tests.ps1','.ps1') }
我有以下未解答的问题,并且我正在寻找解释 Linux 环境中 LF 与 CRLF 行结尾的 PowerShell 核心要求的文档。
1- PWSH Core 可以处理带 CRLF 的文件吗?
2-当我运行以 LF 行结尾的 ps1 文件时,它可以调用另一个以混合 CRLF 行结尾的 ps1 文件吗?
3- PWSH 行结束要求是否已记录并在所有 Linux 发行版中保持一致?
我问上述问题是因为 PowerShell 诞生于 Windows 环境中,并且我希望它能够以某种方式容忍 LF 与 CRLF 的差异。
在线文档的链接将会有很大帮助。我进行了搜索,令人惊讶的是,我找不到任何东西。
我四处搜寻,找不到“否”的直接答案,但也没有找到“是”的直接答案。
我已经知道的:
[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) 考虑以下哈希表:
$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 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 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 (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