【问题标题】:Effect of parens on powershell Get-Content cmdlet括号对 powershell Get-Content cmdlet 的影响
【发布时间】:2013-03-01 15:43:58
【问题描述】:
在 Get-Content cmdlet 周围加上括号有什么作用?为什么我可以使用括号读取和写入同一个文件,但不能没有?
这里是有问题的代码示例。
powershell -command "(Get-Content SomeFile.sql) | ForEach-Object { $_ -replace \"BEFORE\", \"AFTER\" } | Set-Content SomeFile.sql"
默认情况下,Get-Content cmdlet 是否会保留文件句柄直到整个命令执行完毕?
【问题讨论】:
标签:
powershell
cmd
powershell-2.0
【解决方案1】:
Get-Content cmdlet 是否保留了文件句柄
是的。
如果没有括号,管道将在每次Get-Content 输出一个对象(即文件中的一行文本)时运行。
另一方面,Get-Content 将运行到完成,为整个文件创建一个字符串数组,然后为每一行运行管道。
所以在前一种情况下文件将保持打开状态,而在第二种情况下整个文件被读入内存。
【解决方案2】:
如果没有括号,Get-Content 会打开文件以供读取,但同时您实际上会尝试写入同一个文件。
Parens 强制读取操作在进入下一个阶段之前完成,通过管道传递内容。