Вопрос:

Заменить содержимое строки между кавычками в файле

powershell

927 просмотра

3 ответа

250 Репутация автора

Я сделал этот цикл для итерации некоторых файлов, в которых я хочу заменить содержимое.

Содержание , что я хочу , чтобы заменить это строка , которая может выглядеть следующим образом : foo="1".

Мне нужна ваша помощь, как найти строку (я полагаю, регулярное выражение) и обновить файл с новым значением, как, 2например,.

$files = Get-ChildItem -Recurse -Filter "*.config"

foreach ($file in $files)
{
    Get-Content $file.FullName
}

Read-Host
Автор: filur Источник Размещён: 22.01.2016 01:58

Ответы (3)


2 плюса

39967 Репутация автора

Вы можете попробовать регулярное выражение. Ex.

$files = Get-ChildItem -Recurse -Filter "*.config"

$find = 'foo=".*?"'
$replace = 'foo="4"'

foreach ($file in $files)
{
    Get-Content $file.FullName |
    Foreach-Object { $_ -replace $find, $replace } |
        Set-Content $file.Fullname
    }
}

Read-Host

Или изменить только те файлы, которые соответствуют:

$files = Get-ChildItem -Recurse -Filter "*.config"

$find = 'foo=".*?"'
$replace = 'foo="4"'

foreach ($file in $files)
{
    $content = Get-Content $file.FullName
    if(Select-String -InputObject $content -Pattern $find -Quiet) {
        $content |
        Foreach-Object { $_ -replace $find, $replace } |
        Set-Content $file.Fullname
    }
}

Read-Host
Автор: Frode F. Размещён: 22.01.2016 02:25

2 плюса

67471 Репутация автора

Решение

Исходя из примера кода в вопросе, я предполагаю, что вы пытаетесь обновить файл конфигурации .NET (то есть .a web.configили app.configфайл).

Учитывая, что эти файлы действительно являются XML-файлами, вы можете рассматривать их как таковые:

$files = Get-ChildItem -Recurse -Filter "*.config"

foreach ($file in $files)
{
    # Create an XmlDocument object from the file
    $configXml = [xml](Get-Content $file.FullName)

    # Find all the nodes in the document
    $xmlNodes  = $configXml.SelectNodes('//*')

    # Keep track of whether we make changes or not
    $changeCount = 0

    foreach($node in $xmlNodes)
    {
        # Check if node has a "foo" attribute
        if($node.HasAttribute('foo'))
        {
            # Set 2 as the value
            $node.SetAttribute('foo',2)
            $changeCount++
        }
    }

    if($changeCount)
    {
        # At least one node was updated, save to file
        $configXml.Save($file.FullName)
    }
}
Автор: Mathias R. Jessen Размещён: 22.01.2016 02:48

1 плюс

1589 Репутация автора

Это должно ответить на ваш вопрос

$files = Get-ChildItem -Recurse -Filter "*.config"

foreach ($file in $files)
{
    $fileContent = Get-Content $file.FullName
    $newContent = $fileContent -replace 'foo="1"', 'foo="2"'
    Set-Content $file.FullName $newContent
}

Далее читаем здесь: Использование PowerShell для замены текста в строках

Автор: ShaneC Размещён: 22.01.2016 03:00
Вопросы из категории :
32x32