【问题标题】:PowerShell New-CommandWrapper : Supply values for the following parametersPowerShell New-CommandWrapper :为以下参数提供值
【发布时间】:2025-12-31 09:35:09
【问题描述】:

我的意思是给ls 的输出着色。 我检查了Powershell: Properly coloring Get-Childitem output once and for all

这两个选项似乎是:

  1. 使用New-CommandWrapper,正如 OP 和 Jon Z 的回答所提倡的那样。
  2. 使用模块PSColor

我从 OP 获得了New-CommandWrapper 的代码(与provided by O'Reilly 相同),将其放在文件New-CommandWrapper.ps1 中,并将其点源到我的profile.ps1 中。 现在,当我打开一个新会话时,我得到了

cmdlet New-CommandWrapper.ps1 at command pipeline position 1
Supply values for the following parameters:
Name:

这样可以吗?如果是这样,我应该输入什么?或者我该如何解决? (我敢肯定这个问题很简单)。

注意:我无法让PSColor 工作,这可能值得再问一个问题。 正如a comment 中提到的,在导入模块后,(几乎?)任何 cmdlet 输出

Value cannot be null.
Parameter name: command
En línea: 39 Carácter: 9
+         $steppablePipeline.Begin($PSCmdlet)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

编辑: 随着托马斯建议的修改,问题发生了变化。 现在我得到相同的Value cannot be null. 错误。 我想得出结论,他的建议是正确的,我解决了我遇到的许多连锁问题之一......但我不能确定。

【问题讨论】:

  • 在脚本的第一行添加function New-CommandWrapper {,在最后一行添加}
  • @MathiasR.Jessen - 此修改后问题消失了。但是我仍然无法使 dir 颜色起作用。 ls 现在给出了相同的 Value cannot be null. 错误(由与 OP 的 cae 不同的命令产生,当然......我怎么知道这个?)。
  • @MathiasR.Jessen - 此外,为什么使用New-CommandWrapper 的说明没有详细说明这一点?还是我错过了?
  • 好吧,不用修改你直接使用脚本文件,比如.\path\to\New-CommandWrapper.ps1 Command-Name -AddParameter @{ Param = {...} }

标签: powershell


【解决方案1】:

如 cmets 中所述,New-CommandWrapper 被打包为 脚本,而不是作为函数,因此如果您想要点源它,您需要稍微编辑脚本文件:

  1. New-CommandWrapper.ps1 的最顶部插入function New-CommandWrapper {
  2. 在最后一行添加}

现在您可以点源它(如果需要,从您的个人资料中)并使用链接答案中给出的示例:

PS C:\> . .\path\to\New-CommandWrapper.ps1
PS C:\> New-CommandWrapper Out-Default `
>>>    -Process {
>>>        if(($_ -is [System.IO.DirectoryInfo]) -or ($_ -is [System.IO.FileInfo]))
>>>        {if(-not ($notfirst)) {
>>>           Write-Host "    Directory: $(pwd)`n"           
>>>           Write-Host "Mode                LastWriteTime     Length Name"
>>>           Write-Host "----                -------------     ------ ----"
>>>           $notfirst=$true
>>>           }
>>>           if ($_ -is [System.IO.DirectoryInfo]) {
>>>           Write-host ("{0,-7} {1,25} {2,10} {3}" -f $_.mode, ([String]::Format("{0,10}  {1,8}", $_.LastWriteTime.ToString("d"), $_.LastWriteTime.ToString("t"))), $_.length, $_.name) -foregroundcolor "yellow" }
>>>           else {
>>>           Write-host ("{0,-7} {1,25} {2,10} {3}" -f $_.mode, ([String]::Format("{0,10}  {1,8}", $_.LastWriteTime.ToString("d"), $_.LastWriteTime.ToString("t"))), $_.length, $_.name) -foregroundcolor "green" }
>>>           $_ = $null
>>>        }
>>>} 

【讨论】:

  • 这行得通。经过一番调试,我找到了所有痛苦的罪魁祸首:我在profile.ps1 的顶部添加了this answer 顶部建议的代码。它工作正常。但在某些情况下(如在本例中,使用两种方法为dir 输出着色),通过“干扰”其他命令,它会产生Value cannot be null. 错误。此外,如果我在脚本下方添加该代码来为dir 输出着色,它不会在dir 上产生错误,但输出只是白色。
最近更新 更多