默认情况下将cmdlet管道输出发送到out-null?

时间:2017-12-19 18:00:41

标签: powershell

是否有办法自动将cmdlet的管道输出发送到out-null,除非它已明确分配给变量或通过管道传输到out-host?

例如,假设我有一个包含许多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,除非它明确地分配给变量或管道输出到主机” “

可能吗?

2 个答案:

答案 0 :(得分: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 
}

答案 1 :(得分:1)

我发现它可能,但它仍然有点破碎。例如:

   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

问题在于它运行得很好,因为我们假设你想将对象保存到返回的varable中。

   PS> $dir = mkdir xyz2

   PS> $dir
   #nothing to returned!

从积极的方面来说,超出默认值的覆盖很容易删除:

   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-default指定为out-null,而不必担心破坏脚本。