这更多是关于我对管道和功能的薄弱理解,所以希望得到帮助。举个例子:
Get-Service | Select-String win # fails
Get-Service | Out-String -Stream | Select-String win # works
Run Code Online (Sandbox Code Playgroud)
我已经看到了为什么Out-String -Stream需要 的解释,但它让我有点沮丧,所以我想要一个功能oss来完成这个Out-String -Stream部分。我的想法是这样的:
function oss { Out-String -Stream }
Get-Service | oss | Select-String win
Run Code Online (Sandbox Code Playgroud)
但这失败了。有人可以告诉我如何进行这项工作,即使oss功能管道兼容吗?
从那以后,我们如何执行以下操作(显然这行不通,但我真的很好奇这是如何实现的)?
function slx { Out-String -Stream | Select-String <and allow all of the same switches as Select-String> }
Get-Service | slx win
Run Code Online (Sandbox Code Playgroud)
那么,实际上,slx它的一个变体是否Select-String也总是适用于该Out-String -Stream部分?
当 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)的默认版本?
这不是与此相关的其他各种问题的重复(我回顾了它们,但在我看到的问题中没有得到回答)。这些其他问题都围绕着Out-Host -Paging(more即使它们less在问题标题中提到)。
为了关注这一特定点,有谁知道less在 Microsoft Windows 环境下复制 的功能的 PowerShell 方法吗?即使我们能够向下和向上滚动文档(使用光标键逐行或使用 PgUp / PgDn 键逐页)以查看帮助和其他文件(例如,以便我们可以执行操作Get-Help Get-ChildItem -Full | less)。
这将非常有用。我并不追求lessWindows 的第 3 方可执行工具(因为它不会启用管道等)(当然有很多)。我相信 PSCX 中有这样的东西,但每当我尝试安装它时,我都会看到很多冲突,并且我不确定是否使用它,-AllowClobber以防它破坏其他东西。也许在这一点上,如果有的less话,有没有人能够分离出该功能并独立于 PSCX 使用?
举个例子,假设我输入了姓名的一部分:
$ vi partn <= here I press <tab><tab>
partname partnook partnum <= these are the results
Run Code Online (Sandbox Code Playgroud)
这是标准行为bash,这很好,但我最近在 PowerShell 上做了很多工作,其中默认行为是,如果您按 Tab 键,它会循环显示名称,完成每个名称,然后再次按 Tab 键将转到下一个文件,所以如果我按一次 Tab 键,我会看到vi ./partname,然后再次按 Tab 键,我会看到vi ./partnook,然后再次按 Tab 键,我会看到vi ./partnum。我倾向于更喜欢这种行为,因为它减少了输入(您只需按选项卡即可循环浏览,直到获得所需的文件名或命令)。
当然,Linux 中的一切都是可定制的,所以有人可以建议我如何更改默认bash行为以默认遵循上述内容吗?
有人可以解释一下吗?
Import-Module PSReadLine -Scope CurrentUser
Import-Module : Cannot validate argument on parameter 'Scope'.
The argument "CurrentUser" does not belong to the set "Local,Global"
specified by the ValidateSet attribute. Supply an argument that is in the
set and then try the command again.
At line:1 char:37
+ Import-Module PSReadLine -Scope CurrentUser
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Import-Module], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.ImportModuleCommand
Run Code Online (Sandbox Code Playgroud)
但这工作得很好(!)
Install-Module PSScriptAnalyzer -Scope CurrentUser
Run Code Online (Sandbox Code Playgroud)
这工作得很好(!)
Import-Module PSReadLine -Scope Local
Run Code Online (Sandbox Code Playgroud)
帮助文件Install-Module甚至无法识别Local|Global错误中提到的存在。-Scope <String> …
我正在寻找一种方法来删除文件中的所有注释。评论的方式有很多种,但我只对简单#形式的评论感兴趣。原因是我只用于<# #>函数内,.SYNOPSIS即功能代码,而不是注释,所以我想保留它们。
编辑:我已经使用下面的有用答案更新了这个问题。
所以我只需要几个场景:
a)整行注释#在行首(或者可能之前有空格。即正则表达式 of^\s*#似乎有效。
b) 在行首添加一些代码,然后在行尾添加注释。我想避免剥离具有 例如 的行Write-Host "#####",但我认为这已包含在我的代码中。
我能够通过分割删除行尾注释,因为我无法弄清楚如何使用正则表达式来做到这一点,有谁知道如何使用正则表达式来实现这一点?
分割并不理想,因为 a <#on a line 会被 the 删除-split,但我已经通过 split on 修复了这个问题" #"。这并不完美,但可能足够好 - 也许存在更可靠的正则表达式方法?
当我对 7,000 行长的脚本执行以下操作时,它可以工作(!)并删除大量注释,但是,输出文件的大小几乎翻倍(!?)从 400kb 到大约 700kb。有谁明白为什么会发生这种情况以及如何防止这种情况(这与 BOM 或 Unicode 或类似的东西有关吗?Out-File 似乎真的会增加文件大小!)
$x = Get-Content ".\myscript.ps1" # $x is an array, not a string
$out = ".\myscript.ps1"
$x = $x -split "[\r\n]+" # Remove all consecutive line-breaks, in …Run Code Online (Sandbox Code Playgroud) 我不太清楚 @{n=;e=} 构造如何在 PowerShell 中工作。这种类型的东西是否有我可以从中找到示例的名称?
例如,我发现这样的例子效果很好:
gwmi win32_logicaldisk | Format-Table DeviceId, VolumeName, @{n="Size(GB)";e={[math]::Round($_.Size/1GB,2)}},@{n="Free(GB)";e={[math]::Round($_.FreeSpace/1GB,2)}}
Run Code Online (Sandbox Code Playgroud)
当我尝试做这样的事情时,我永远无法让它发挥作用。这工作正常:
Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType
Run Code Online (Sandbox Code Playgroud)
所以我想我会尝试使用该函数的定义添加到一个新列 cat function:\$_.Name
Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType,@{n="Contents"; e={cat function:\$_.Name}}
Run Code Online (Sandbox Code Playgroud)
但我只得到一个空Contents列:( 有人能给我一些关于 @{n=;e=} 构造如何工作的指示吗?还有,nande代表什么?
我用谷歌搜索了很多解决方案,但没有找到一个完全有效的解决方案。我自己的粗略工作是:
[ $(which curl) -eq "" ] || sudo apt install curl
Run Code Online (Sandbox Code Playgroud)
这不太有效,说“预期是一元运算符”。我已经尝试过=或==,所以我不知道如何进行这样的测试。空输出是否有可能which curl是 $null 而我必须对此进行测试?
或者,有没有办法只运行sudo apt install curl然后2>&null在最后抑制它是否已经安装?