将Powershell命令的详细程度降低到最小格式

时间:2015-12-07 21:12:21

标签: powershell

我在我的一个Powershell脚本中执行以下操作:

New-Item -ItemType Directory -Path "MyFolder"

输出看起来像这样:

PS C:\> .\example.ps1


       Directory: C:\


   Mode                LastWriteTime     Length Name
   ----                -------------     ------ ----
   d----         12/7/2015   9:52 PM            MyFolder


 
PS C:\>

这是八个输出线的总计。我的脚本作为我的msbuild文件中的任务的一部分运行,并且Visual Studio中的输出空间有限,所以这非常烦人。

现在我明白我可以将输出管道输出到Out-Null来压缩所有这些行,但我确实喜欢关于命令发生的一些反馈。一行反馈将是最佳的。

我想这种解决方法可行:

Write-Host "Creating folder MyFolder"
New-Item -ItemType Directory -Path "MyFolder" | Out-Null

但是一直记住/写这个是很乏味的。

我想另一个解决方法是创建某种包装器功能,但是再次因为New-Item只是一个例子,我必须编写许多包装器。相反,我正在寻找一种适用于***-Item cmdlet的技术。

有没有办法降低New-Item等命令的详细程度,而不必求助于解决方法?

我经历过the New-Item documentation但没有发现任何线索。也许我的解决方法是实现这一目标的唯一方法吗?

底线 :是否有惯用方法将New-Item输出压缩到一行?

6 个答案:

答案 0 :(得分:2)

New-Item的管道输出是System.IO.DirectoryInfo对象,向控制台发送DirectoryInfo的默认处理是您看到的详细输出。

PS> cd d:\temp
PS> $output = New-Item -ItemType Directory -Path "MyFolder"
PS> $output

    Directory: D:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2015-12-07     13:15            foo

(这里的$output变量是多余的;我只是在示例中使用它来缩短行并避免在测试时创建一堆新目录。:)

减少详细程度的一种方法是使用管道过滤器仅输出您感兴趣的数据,而不是整个DirectoryInfo。将其格式化为字符串,输出只需要一行。通常这是属性NameFullName

PS> $output | Select-Object -ExpandProperty FullName
D:\temp\MyFolder

创建日志文件时,知道操作是什么也很有用。您可以使用foreach从DirectoryInfo对象创建自定义字符串。

PS> $output | % { "Created directory '$($_.Name)' in parent '$($_.Parent.FullName)'" }
Created directory 'MyFolder' in parent 'D:\Temp'

而且,如果你打算这么做,你甚至可以为它创建一个速记过滤功能。

PS> filter Format-DirectoryOperation($verb) {
>>    "$verb directory '$($_.Name)' in parent '$($_.Parent.FullName)'"
>>  }
PS> $output | Format-DirectoryOperation('Created')
Created directory 'foo' in parent 'D:\temp'

答案 1 :(得分:1)

为什么不简单:

New-Item -ItemType Directory -Path "MyMyFolder" | % { Write-Output "Directory created !" }

答案 2 :(得分:1)

如果您正在编写脚本,我建议使用try-catch。这样你就可以确定它是否有效。这是一个更多的编码,但如果脚本可能没有按预期运行,绝对值得做。

try {
  New-Item -ItemType Directory -Path "MyFolder" -ErrorAction Stop | Out-Null
  Write-Output "Created folder MyFolder"
}
catch {
  "Failed to create folder MyFolder"
}

答案 3 :(得分:1)

惯用的方法是扩展所创建对象的Name(或FullName)属性:

New-Item 'foo' -Type Directory | select -Expand FullName

如果您经常需要这个,可以将它包装在这样的自定义函数中:

function New-Folder {
  [CmdletBinding()]
  Param(
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$Path
  )

  New-Item $Path -Type Directory | Select-Object -Expand FullName
}

并将其放入profile

答案 4 :(得分:1)

以下是一些用于更改PS cmdlet输出的其他技术。一个是通过format.ps1xml个文件(help about_format.ps1xml)。 .PS1XML文件实际上并不直接针对cmdlet的输出,它们以各种格式方法为目标输出。 format- * cmdlet对应于各种格式方法。 format- * cmdlet(显式或隐式)用于显示所选.NET类型的实例。因此,通过修改或创建.PS1XML文件,您可以有效地更改从* -item cmdlet中显示的对象实例的显示方式。

另一种技术是包装或代理cmdlet。这里描述了这个a blog

另一种可能性来编写自己的" PS提供商" (尝试get-psprovider查看现有提供商)。 * -item cmdlet专门设计用于内置和附加提供程序。通过编写文件系统提供程序,您可以对* -item cmdlet施加大量控制。您需要提出另一个驱动器号约定而不是C:,D:等等,因为已经使用了它。但希望你的MSBUILD文件没有太多硬编码的驱动器号用途。

答案 5 :(得分:0)

我很惊讶没有看到像

那样简单的事情
$output = New-Item -ItemType Directory -Path "MyFolder"
"$output"

d:\test\MyFolder

将DirectoryInfo转换为字符串会将其转换为单行名称,并将其嵌入到字符串中的命令中:

- >

PS D:\t\> "Creating folder: $(New-Item -ItemType Directory -Path 'MyFolder')"

Creating folder: D:\t\MyFolder

可以使用别名缩短命令行输入 - >

"$(ni -i d MyFolder)"

- >

"$(md MyFolder)"

但是,正如评论所说," 相反,我正在寻找一种适用于___- Item cmdlet的技术。"不太可能发生,因为问题不在于cmdlet是冗长的,而是与cmdlet的返回值有关,而 可能会因您查找的PSProvider而异。使用。在这种情况下,它返回一个DirectoryInfo,但如果你cd variable:\; $r = New-Item -ItemType directory -Value test -Name test返回的是PSVariable类型,依此类推其他内容。