将控制台输出写入文件-文件意外为空

Mik*_*e C 5 powershell file-io pipeline

我是脚本新手,我正尝试将有关VM的返回信息写到文本文件中。我的脚本如下所示:

Connect-VIServer -Server 192.168.255.255 -Protocol https -User xxxx -Password XXXXXX

Get-VM -Name xxxxxx 

Get-VM xxxxx | Get-HardDisk | Select Parent, Name, Filename, DiskType, Persistence | FT -AutoSize 

Out-File -FilePath C:Filepath
Run Code Online (Sandbox Code Playgroud)

我能够连接到VM,检索HDD信息并在控制台中看到它。该文件将在需要的位置创建并正确命名。文件中没有数据。我尝试过Tee-Object,结果相同。我也尝试了-append开关。我确实看到了有关将数据作为数组返回的文章,而Powershell无法将数据从数组移至字符串。我是否需要创建一个变量来保存返回的数据并从那里写入文件?

谢谢

mkl*_*nt0 6

Guenther Schmitz的回答很有效,但是值得解释一下原因:

  • 您Out-File -FilePath C:Filepath是一个不接收任何输入的独立命令。

    • Out-File没有输入的调用只会创建一个空文件(0字节)。
  • 为了使cmdlet Out-File能够从其他命令接收输入(...如下所示),必须使用管道,这意味着您必须|在输入命令之后放置a 并跟随其Out-File调用:
    请注意,我-Path为不太常用的[1]使用了较短的参数别名-FilePath

    ... | Out-File -Path C:Filepath
    
    Run Code Online (Sandbox Code Playgroud)
    • 在最简单的情况下,如上所述,将整个命令(管道)放在同一行上;如果您希望将其分布在多行以提高可读性,则有两种选择:

另外,由于您使用的Out-File是默认行为,因此可以使用>输出重定向来代替:

... > C:Filepath
Run Code Online (Sandbox Code Playgroud)

几个方面:

  • Out-File与字符串以外的其他东西一起使用,以及Format-*通常使用cmdlet,这意味着输出仅适合显示(人类消耗),不适用于进一步的程序处理。

  • 如果你想输出发送到两个控制台和一个文件,使用Tee-Object小命令,如TobyU建议:

    ... | Tee-Object -Path C:Filepath
    
    Run Code Online (Sandbox Code Playgroud)

[1]严格来说,-LiteralPath在这种情况下是最好的选择,因为-Path它将其参数解释为通配符表达式。但是,省略-Path(即通常将文件路径指定为位置参数)隐式绑定到-Path。


Gue*_*itz 4

尝试这个:

Get-VM xxxxx |
 Get-HardDisk |
   Select Parent, Name, Filename, DiskType, Persistence |
     Out-File -FilePath C:\Filepath
Run Code Online (Sandbox Code Playgroud)