将控制台输出写入文件 - 文件意外为空
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
.
我是脚本编写新手,我正在尝试将返回的有关 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
.