如何在PowerShell中准备文件



我正在生成两个文件,userscript.meta.jsuserscript.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
}

相关内容

  • 没有找到相关文章