我正在生成两个文件,userscript.meta.js
和userscript.user.js
。我需要把userscript.meta.js
的输出放在userscript.user.js
的最开始。
Add-Content
似乎不接受要预置的参数,并且Get-Content | Set-Content
将失败,因为Get-Content
正在使用userscript.user.js
。
如果物理上可以有一个干净的解决方案,我宁愿不创建一个中间文件。
如何做到这一点?
子表达式运算符$( )
可以计算两个Get-Content
语句,然后枚举这些语句并通过管道传递到Set-Content
:
$(
Get-Content userscript.meta.js -Raw
Get-Content userscript.user.js -Raw
) | Set-Content userscript.user.js
如果当前目录不在文件所在的位置,请考虑使用文件的绝对路径。
一种比上述更简单的方法是将路径按所需顺序排列,因为-Path
和-LiteralPath
参数都可以取多个值:
(Get-Content userscript.meta.js, userscript.user.js -Raw) |
Set-Content userscript.user.js
如果你想去掉多余的前导或尾随空白,你可以包括String.Trim
方法:
(Get-Content userscript.meta.js, userscript.user.js -Raw).Trim() |
Set-Content userscript.user.js
注意,在上面的示例中,分组运算符( )
是强制性的,因为我们需要在通过管道传递到Set-Content
之前消耗Get-Content
的所有输出。有关更多详细信息,请参见管道分组表达式。
对于未来的用户,如果您需要为多个文件准备相同的东西,这里有一个片段:
示例:为一堆自动生成的C++文件准备一个#include
指令,这样它就可以在我的Windows环境中工作。
Get-ChildItem -Path . -Filter *.cpp | ForEach-Object {
$file = $_.FullName
# the -Raw param was important for me as it didn't read the entire
# file properly without it. I even tried [System.IO.File]::ReadAllText
# and got the same thing, so there must have been some characater that
# caused the file read to return prematurely
$content = Get-Content $file -Raw
$prepend = '#include "stdafx.h"' + "`r`n"
#this could also be from a file: aka
# $prepend = Get-Content 'path_to_my_file_used_for_prepending'
$content = $prepend + $content
Set-Content $file $content
}