Powershell输出重定向有什么问题?

lb3vh1jj  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(143)

我正在编写一个简单的命令/脚本,用于监视PowerShell中的内存使用情况,它看起来如下:

PS C:\Temp_Folder> while ($true) {
>> Get-Date
>> TaskList /FI "PID eq 82660" | findstr /I "Prod"
>> Start-Sleep 1 }

字符串
此命令/脚本在提示符上显示结果,但由于我希望有很多结果,我想输出到一个文件中,所以我这样做了(参见this official URL):

PS C:\Temp_Folder> while ($true) {
>> Get-Date
>> TaskList /FI "PID eq 82660" | findstr /I "Prod"
>> Start-Sleep 1 } 2>&1 >>.\Geheugen.txt


然而,这似乎行不通:

PS C:\Temp_Folder> dir Geheugen.txt
dir : Cannot find path 'C:\Temp_Folder\Geheugen.txt' because it does not exist.
At line:1 char:1
+ dir Geheugen.txt
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp_Folder\Geheugen.txt:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


我已经尝试了有和没有错误重定向(2>&1和使用追加和覆盖(>>>)),但没有运气。
我知道命令/脚本正在工作:我在提示符上看到了结果。
我做错了什么?

调查后编辑:

显然,有一个Out-File命令,应该如下使用:

PS C:\Temp_Folder> while ($true) {
>> Get-Date
>> TaskList /FI "PID eq 82660" | findstr /I "Prod"
>> Start-Sleep 1 } 2>&1 | Out-File -FilePath .\Geheugen.txt


这是非常令人困惑的:
在DOS(Windows命令行)中,总是可以使用标准的重定向操作符>>>重定向到文件。显然,这些操作符在Windows Powershell中也是可以预见的,但有时它们不起作用。有人能准确描述一下吗?

额外测试:

Out-File似乎不工作,正如你所看到的:

while ($true) {
>> Get-Date
>> TaskList /FI "PID eq 4240" | findstr /I "Prod"
>> Start-Sleep 1 } | Out-file -FilePath .\Prod_Server_Monitoring.txt


我收到以下错误消息:

At line:4 char:17
+ Start-Sleep 1 } | Out-file -FilePath .\Prod_Server_Monitoring.tx ...
+                 ~
An empty pipe element is not allowed.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : EmptyPipeElement

hof1towb

hof1towb1#

奇怪。在我的7.4.0中,你的第一个例子没有返回任何错误,使用完全相同的代码。
它也不写文件,但这是正常的:您试图写while本身的成功和错误流,而不是它运行的代码的内容。
您需要将整个while(){}封装在变量(es:$(while{}) >> 'file.txt')或脚本块(es:& { while(){} } >> 'file.txt')中
但是,如果您想保留终端输出,则可能需要使用Tee-Object

编辑自问题作者:

我把while循环放在一个变量中,这确实解决了这个问题:

$(while ($true) { 
...
}) >>.\Prod_Server_Monitoring.txt

字符串

abithluo

abithluo2#

你不能在while循环后添加| Out-File,因为循环不返回任何值。你需要在特定的命令后添加。同时添加-Append标志以不覆盖你的文件

while ($true) {
    Get-Date
    TaskList /FI "PID eq 4240" | findstr /I "Prod" | Out-File 
    .\Prod_Server_Monitoring.txt -Append
    Start-Sleep 1
}

字符串

相关问题