Kirill Moskalew
Kirill Moskalew

Reputation: 79

How I can do this powershell script better?

When I move FenrirFS profile to another, paths in directories become wrong. So I decided to make a ps script to resolve it.

$wdir = "files"       # constant part of path
$path = $PSScriptRoot # path to script
$pfix = "Target="     # prefix of path

$files = Get-ChildItem -Path $path -Filter *.alias | Where { ! $_.PSIsContainer } | Select -Expand Name

foreach ($file in $files) 
{
    $filec = Get-Content $file
    $nlin = 0         # counter of line

    foreach ($line in $filec) 
    {
        if($line.Contains($pfix)) 
        {
            $nline = $pfix + $path + '\' + $wdir + ($line -split $wdir)[1]
            $filec[$nlin] = $filec[$nlin].replace($line,$nline)
            $filec | Set-Content $file
            break
        }
    $nlin++ 
    }
}

It's work, but I have a lot of files, which I should replace. And $filec | Set-Content $file a little bit dumby, cuz I need to replace only one line. Example of file:

Target=E:\home\prj\polygon\ps\files\NoDigital\godTech_2.JPG
DisplayName=godTech_2.JPG
WorkDir=
Arguments=
ShowCmd=0

ps script is located in the directory with aliases.

p.s. powershell 5.1

Upvotes: 0

Views: 76

Answers (1)

Theo
Theo

Reputation: 61253

You could use the much faster switch for that:

$wdir = "files"       # constant part of path
$path = $PSScriptRoot # path to script
$pfix = "Target="     # prefix of path

$files = Get-ChildItem -Path $path -Filter '*.alias' -File | ForEach-Object {
    $content = switch -Regex -File $_.FullName {
        "^$pfix"  { 
            $oldPath = ($_ -split '=', 2)[-1].Trim()
            $childPath = Join-Path -Path $wdir -ChildPath ($oldPath -split $wdir, 2)[-1] 
            # output the new path
            "$pfix{0}" -f (Join-Path -Path $path -ChildPath $childPath)
        }
        default { $_ }
    }
    $content | Set-Content -Path $_.FullName -Force
}

Upvotes: 2

Related Questions