【问题标题】:send cmdlet pipe output to out-null by default?默认情况下将 cmdlet 管道输出发送到空值?
【发布时间】:2017-12-19 18:00:41
【问题描述】:

有没有办法自动将 cmdlet 的管道输出发送到 out-null,除非它被显式分配给变量或通过管道传输到主机外?

例如,假设我有一个包含许多 cmdlet 的脚本,这些 cmdlet 将一个无关对象转储到您不想保存或查看的控制台:

mkdir dir1 | out-null
mkdir dir2 | out-null
mkdir dir3 | out-null

我发现解决此问题的唯一方法是将输出通过管道输出到 null 或将其分配给我丢弃的变量。我想要做的是在我的脚本顶部将 out-default 重新分配给 out-null 以产生上述效果。我只是认为总是需要在每一行上放置“out-null”以避免使用powershell:“自动将cmdlet的管道输出发送到out-null,除非它被显式分配给变量或通过管道传输到主机"

有可能吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以使用默认参数。每次调用New-Itemmkdir 的别名)时都会用到这个

    $PSDefaultParameterValues = @{
        'New-Item:OutVariable' = 'Null'
        'Disabled' = $False
    }
    

    经过测试,上述方法不应该起作用,因此您的替代方法是在脚本开头创建一个函数:

    Function New-Dir
    {
        Param([Parameter(Mandatory,Position=0)][String]$Path)
    
        #force creates subfolders if they don't exist
        New-Item -Path $Path -ItemType Directory -Force >$Null 
    }
    

    【讨论】:

    • @BillMoore 这是一个自动变量that is well-documented。完成后,您可以使用Disabled 成员将其关闭。您还可以根据自己的使用方式限制其范围。
    【解决方案2】:

    我发现它是可能的,除了它仍然有点坏。示例:

       PS> function out-default {$input | out-null}
    
       #ok. Works great
       PS> mkdir xyz
       # output directory object is sent to null and not displayed to out-host
    
       #now explictly asking for the object to override out-default
       PS> mkdir xyz123 | out-host
       Directory: C:\Users\john\sandbox\tmp
       Mode      LastWriteTime    Length   Name
       ---       -------------    ------   ----
       ---       12/19/2017       1:26 PM  xyz123
    

    问题是它工作得很好,因为假设你想将对象保存到一个返回变量。

       PS> $dir = mkdir xyz2
    
       PS> $dir
       #nothing to returned!
    

    从积极的方面来说,out-default 的覆盖很容易删除:

       PS> del function:out-default
    

    现在恢复了预期的默认行为:

       PS> $dir = mkdir xyz3
    
       PS> $dir
       Directory: C:\Users\john\sandbox\tmp2
        Mode      LastWriteTime    Length   Name
        ---       -------------    ------   ----
        ---       12/19/2017       1:26 PM  xyz3
    
       PS> mkdir xyz4
       Directory: C:\Users\john\sandbox\tmp2
       Mode      LastWriteTime    Length   Name
       ---       -------------    ------   ----
       ---       12/19/2017       1:26 PM  xyz4
    

    如果分配变量与默认值分开会很好。因为这样您就可以将整个脚本的 out-default 分配给 out-null ,而不必担心会破坏脚本。

    【讨论】:

    • 聪明,虽然可以说比我的一次性建议更邪恶,因为它会影响所有输出。 Today, I learned.
    • 作为一个建议,我会避免在您的脚本中使用别名,尤其是当它们在团队成员之间共享时。使您的代码尽可能易读始终是一个好习惯。别名非常适合 CLI 工具,但当有人试图弄清楚 SLS 是什么时,别名就不是很好
    • 就目前而言,我同意......但是,它几乎不是邪恶的......我觉得可以将变量分配给管道输出,同时仍将控制台输出重定向到 null ...也许是具有这种行为的新的空 cmdlet?但是不知道如何实现它......
    • 就目前而言,最简单的方法是将命令包装在您自己的函数中或重载函数名称:Function New-Item { Microsoft.PowerShell.Management\New-Item @PSBoundParameters >$Null }。此外,Out-Null 比其他 3 种方法(分配给变量、文件重定向到 null 或 void 强制转换)慢得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多