我想创建一个Powershell脚本,将文本添加到* .jsp * .sh * .cmd文件中。我还想检查文件是否已经存在于该文件中,如果确实存在,则会跳过该文件。到目前为止,我找到了Select-String,它将在文件中找到文本。然后,我如何使用此信息将文本添加到没有文本的文件的顶部?我还发现Add-Content似乎添加了我想要的内容,但是我想在开头做这个并且有一些逻辑,不仅在每次运行ps1时都重复添加它。
Select-String -Pattern "TextThatIsInMyFile" -Path c:\Stuff\batch\*.txt
Add-Content -Path "c:\Stuff\batch\*.txt" -Value "`r`nThis is the last line"
答案 0 :(得分:7)
与@MikeWise非常相似,但优化得更好。我有它拉数据并使提供程序过滤返回的文件(比后续过滤好得多)。然后我使用Where
的{{1}}参数将其传递给Select-String
语句,以便为Where提供布尔值$ true / $ false。这样,只查看您想要查看的文件,只有那些缺少您需要的文本的文件才会被更改。
-quiet
修改:您发现Get-ChildItem "C:\Stuff\Batch\*" -Include *.jsp,*.sh,*.cmd -File |
Where{!(Select-String -SimpleMatch "TextThatIsInMyFile" -Path $_.fullname -Quiet)} |
ForEach{
$Path = $_.FullName
"TextThatIsInMyFile",(Get-Content $Path)|Set-Content $Path
}
无法与\*
一起使用。如果您需要递归,请使用以下内容:
-Recursive
答案 1 :(得分:0)
参阅手册:https://technet.microsoft.com/en-us/library/hh849903.aspx
具体做法是:
输出
输出类型是cmdlet发出的对象的类型。 •Microsoft.PowerShell.Commands.MatchInfo或System.Boolean 默认情况下,输出是一组MatchInfo对象,每个匹配对应一个。 如果您使用安静参数,则输出为布尔值,表示是否找到了模式。
我还认为你还需要为每个文件执行此操作。所以(可能):
$files = Get-ChildItem "C:\Stuff\batch" -Filter *.txt
for ($i=0; $i -lt $files.Count; $i++)
{
$filename = $files[$i].FullName
$b = Select-String -Quiet -Pattern "TextThatIsInMyFile" -Path $fileName
if (-not $b)
{
Add-Content -Path $fileName -Value "`r`nTextThatIsInMyFile"
}
}
我测试了这个,我认为它可以做你想要的,即将文本添加到没有它的文件的末尾,而不是多次执行。
答案 2 :(得分:0)
您可以Get-Content
使用Contains()
来检查文本是否存在
并且您可以使用Set-Content
和Add-Content
来操作文本并将其放在文件的顶部。
function Add-FirstLine {
param
(
[string]$Path,
[string]$Value
)
$CurrentContent = Get-Content $Path
Set-Content -Path $Path -Value $Value
Add-Content -Path $Path -Value $CurrentContent
}
$myText = "new line"
if(!(Get-Content -Path C:\file.txt).Contains($myText))
{
Add-FirstLine -Path C:\file.txt -Value $myText
}