Replace string in multiple files in powershell

This is by using powershell.

@Navya_Budagam

Is it ok if we do the same with UiPath then we can store the files as well which are modified…because in power shell you are not storing them…or either store all those files names as well where it is modified

For each file in folder

  1. Read Text file
    2 . If condition to check
  2. Replace on then side and save fielname
  3. On Else side do nothing

This way you can replace and also save the files which are modified

Hope this helps

cheers

If possible, could you please share the sample script to replace string values in powershell?

@Navya_Budagam

In your powershell ypu already have relace…what you need is getting to save the filenames

Better convert to UiPath…it wuld be more readable…if using UiPath no point going with powershell for this

Cheers

Thank you Anil, but at this moment I’m looking for the solution in powershell.

Hi

Welcome to UiPath community

Hope this script would help you

$directory = “C:\path\to\directory”
$searchPattern = “.
$oldString = “oldString”
$newString = “newString”

$modifiedFiles = @()

Get-ChildItem -Path $directory -Include $searchPattern -Recurse |
ForEach-Object {
if ($_ -is [System.IO.FileInfo]) {
$content = Get-Content $.FullName
if ($content -match $oldString) {
$modifiedContent = $content -replace $oldString, $newString
Set-Content $
.FullName $modifiedContent
$modifiedFiles += $_.FullName
}
}
}

$modifiedFiles | Out-String -Stream

In UiPath, you can use the Invoke PowerShell activity to execute this script. The modified file names will be stored in the modifiedFiles variable, which you can access later in your workflow.

Cheers @Navya_Budagam

Thank you @Palaniyappan

I ran the attached script, but it is not replacing anything. Do you see any issues with the script?

Can u paste the script here so that I can try it out

@Navya_Budagam

Thank you @Palaniyappan

Here is the script…

$directory=“C:\Users\Desktop\powershell”

$searchpattern=“.”

$oldstring= “India”

$newstring= “America”

$modifiedfiles= @()

get-childitem -path $directory -Include $seachpattern -Recurse | Foreaxh-object {

If($_ -is [System.IO.Fileinfo]) {

$content=get-content $.Full Name if($content -match $oldstring) {

$modifiedcontent=$content -replace $oldstring,$newstring

Set-content $.FullName $modifiedcontent

$modifiedfiles +=$_.FullName

}}}

$modifiedfiles | out-string -stream

@Navya_Budagam

Can you please try this

$directory = "C:\Users\Desktop\powershell"
$searchpattern = "*.*"
$oldstring = "India"
$newstring = "America"
$modifiedfiles = @()

Get-ChildItem -Path $directory -Include $searchpattern -Recurse | ForEach-Object {
    if($_.GetType().Name -eq "FileInfo") {
        $content = Get-Content $_.FullName
        if($content -match $oldstring) {
            $modifiedcontent = $content -replace $oldstring, $newstring
            Set-Content $_.FullName $modifiedcontent
            $modifiedfiles += $_.FullName
        }
    }
}

$modifiedfiles | Out-String -Stream

Cheers

Hi @Navya_Budagam

Try these steps-

  1. Use Directory.GetFiles activity in UiPath to get a list of all the files in the directory that you want to search and replace the string in.
  2. Loop through the array of files using a For Each loop activity in UiPath.
  3. Inside the loop, use the Read Text File activity in UiPath to read the contents of the current file.
  4. Use the Replace method in UiPath to replace the desired string with the new string in the contents of the file. Store the modified contents in the same string variable.
  5. Use the Write Text File activity in UiPath to write the modified contents back to the same file. Provide the file path and the modified contents as inputs to the activity.
  6. Add a condition to check if the contents of the file were actually modified. You can use the String.Equals method in UiPath to compare the contents of the file before and after the replacement. If they are not equal, then the file was modified.
  7. If the file was modified, add the file name to a list or any other data structure to capture the file names that have been modified.
  8. Continue the loop until all the files in the directory have been processed.
  9. After the loop, you can access the list of modified file names and use it for further processing as needed.

Thanks!!

1 Like

Excellent @Anil_G
Now I’m able to capture the file names that have been modified. Appreciate your support.

I have found an issue while running this script on a number files in windows file system.
For ex: I have a file name called utility+team+[old±+retired+7%2f15%2f2016] and looks like script is not able to recognize these kind file names and getting below error. I believe file name is a valid one otherwise Windows would have thrown an error while creating the file.

Any thoughts?

Get-Content : An object at the specified path
"C:\Users\Desktop\powershell\replace\utility+team+[old±+retired+7%2f15%2f2016].txt does not exist, or has been filtered
by the -Include or -Exclude parameter.
At line:11 char:20

  •     $content = Get-Content $_.FullName
    
  •                ~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (System.String:String) [Get-Content], Exception
    • FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand
1 Like

Thank you @Nitya1 for responding to this post. The solution shared by @Anil_G is working fine.

Appreciate your support.

1 Like

@Navya_Budagam

Can you try this…I changed path to literalpath which would try for special characters as well

$directory = "C:\Users\Desktop\powershell"
$searchpattern = "*.*"
$oldstring = "India"
$newstring = "America"
$modifiedfiles = @()

Get-ChildItem -LiteralPath $directory -Include $searchpattern -Recurse | ForEach-Object {
    if($_.GetType().Name -eq "FileInfo") {
        $content = Get-Content -LiteralPath $_.FullName
        if($content -match $oldstring) {
            $modifiedcontent = $content -replace $oldstring, $newstring
            Set-Content -LiteralPath $_.FullName $modifiedcontent
            $modifiedfiles += $_.FullName
        }
    }
}

$modifiedfiles | Out-String -Stream

Hope this helps

Cheers

Hi @Anil_G

Much appreciated your continuous support.

Could you please assist on the below issues?

Scenario-1: -LiteralPath is accepting files having special characters in the name, but it introduced another bug

Currently “PowerShell” directory contains 3 files .txt, .xml and .atr
I have modified the script to exclude .atr files, So I have updated below 2 lines in the script…

$searchpattern = “*.atr”
and
Get-ChildItem -LiteralPath $directory -Exclude $searchpattern -Recurse | ForEach-Object {

Before placing -LiteralPath parameter, the script was excluding .atr files but after placing -LiteralPath it is not excluding .atr files and replacing the text if a match found in .atr files.

$directory = “C:\Users\Desktop\PowerShell”
$searchpattern = “*.atr”
$oldstring = “India”
$newstring = “America”
$modifiedfiles = @()

Get-ChildItem -LiteralPath $directory -Exclude $searchpattern -Recurse | ForEach-Object {
if($.GetType().Name -eq “FileInfo”) {
$content = Get-Content -LiteralPath $
.FullName
if($content -match $oldstring) {
$modifiedcontent = $content -replace $oldstring, $newstring
Set-Content -LiteralPath $.FullName $modifiedcontent
$modifiedfiles += $
.FullName
}
}
}

$modifiedfiles | Out-String -Stream

Scenario-2: How can we replace multiple string values with in the file. for example,

runAs=“India” → runAs=“America”
and
runAsGuid=“India” → runAsGuid=“America”

@Navya_Budagam

I hope this is what you are looking for

$directory = "C:\Users\Desktop\powershell"
$searchpattern = "*.*"
$oldstring1 = 'runAs="India"'
$newstring1 = 'runAs="America"'
$oldstring2 = 'runAsGuid="India"'
$newstring2 = 'runAsGuid="America"'
$modifiedfiles = @()

Get-ChildItem -Path $directory -Include $searchpattern -Exclude *.atr -Recurse | ForEach-Object {
    if($_.GetType().Name -eq "FileInfo") {
        $content = Get-Content $_.FullName
        if($content -match $oldstring1 -or $content -match $oldstring2) {
            $modifiedcontent = $content -replace [regex]::Escape($oldstring1), $newstring1 -replace [regex]::Escape($oldstring2), $newstring2
            Set-Content $_.FullName $modifiedcontent
            $modifiedfiles += $_.FullName
        }
    }
}

$modifiedfiles | Out-String -Stream

Cheers

Hi @Anil_G
How come this resolves the previous issue of accepting filenames which contains special characters?

Able to update multiple string values but getting below error for the file which has special characters.

Get-Content : An object at the specified path
C:\Users\Desktop\PowerShell\utility+team+[old±+retired+7%2f15%2f2016].txt does not exist, or has been filtered
by the -Include or -Exclude parameter.
At line:11 char:20

  •     $content = Get-Content $_.FullName
    
  •                ~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (System.String:String) [Get-Content], Exception
    • FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand

@Navya_Budagam

My Bad…I have modified the old one…please check this

$directory = "C:\Users\Desktop\powershell"
$searchpattern = "*.*"
$oldstring1 = 'runAs="India"'
$newstring1 = 'runAs="America"'
$oldstring2 = 'runAsGuid="India"'
$newstring2 = 'runAsGuid="America"'
$modifiedfiles = @()

Get-ChildItem -LiteralPath $directory -Include $searchpattern -Exclude *.atr -Recurse | ForEach-Object {
    if($_.GetType().Name -eq "FileInfo") {
        $content = Get-Content -LiteralPath $_.FullName
        if($content -match $oldstring1 -or $content -match $oldstring2) {
            $modifiedcontent = $content -replace [regex]::Escape($oldstring1), $newstring1 -replace [regex]::Escape($oldstring2), $newstring2
            Set-Content -LiteralPath $_.FullName $modifiedcontent
            $modifiedfiles += $_.FullName
        }
    }
}

$modifiedfiles | Out-String -Stream

cheers

1 Like

Hi @Anil_G - This solution is working fine without any issues. I will apply this logic on a broader file system and get back to you if I see any issues :slight_smile:

I appreciate the time and effort you invested to help on this. Thank you for your continuous effort.

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.