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

Writing console output to a file - file is unexpectedly empty

我是脚本编写新手,我正在尝试将返回的有关 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

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

谢谢

试试这个:

Get-VM xxxxx |
 Get-HardDisk |
   Select Parent, Name, Filename, DiskType, Persistence |
     Out-File -FilePath C:\Filepath

有效,但值得解释一下原因:

  • 您的Out-File -FilePath C:Filepath是一个独立命令,接收无输入

    • 没有输入的 Out-File 调用只会创建一个 空文件0 字节)。
  • 为了让 Out-File 等 cmdlet 接收来自(一个)其他命令(在下面表示为 ...)的输入,您必须使用 pipeline,这意味着您必须在输入命令后放置一个 |,然后在您的 Out-File 调用之后:
    请注意,我为不太常用的 -FilePath[1][= 使用了较短的 -Path 参数别名38=]

    ... | Out-File -Path C:Filepath
    
    • 最简单的情况,如上,整个命令(管道)放在同一行;如果您想将其分布在多行中以提高可读性,您有两种选择:

      • | 之后立即换行,告诉 PowerShell 命令在下一行继续:

        ... |
          Out-File -Path C:Filepath
        
      • 以明确的续行结束一行,这意味着将 ` 放在一行的 末尾 :

        ... `
        | Out-File -Path C:Filepath
        

或者,由于您使用的是 Out-File 及其默认行为,您可以使用 >,一个输出重定向,而不是:

... > C:Filepath

一些旁白:

  • Out-File 与字符串以外的其他内容一起使用,并且通常使用 Format-* cmdlet,意味着输出仅适用于 display(人类消费),不用于进一步程序化处理

  • 如果要将输出发送到两个控制台一个文件,请使用Tee-Object cmdlet, as TobyU建议:

    ... | Tee-Object -Path C:Filepath
    

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