如果不存在,Powershell会将文本添加到文件中

时间:2015-02-13 21:06:21

标签: powershell

我想创建一个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"

3 个答案:

答案 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-ContentAdd-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
}