This is by using powershell.
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
- Read Text file
2 . If condition to check - Replace on then side and save fielname
- 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?
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?
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
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
Try these steps-
- 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.
- Loop through the array of files using a For Each loop activity in UiPath.
- Inside the loop, use the Read Text File activity in UiPath to read the contents of the current file.
- 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.
- 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.
- 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.
- 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.
- Continue the loop until all the files in the directory have been processed.
- After the loop, you can access the list of modified file names and use it for further processing as needed.
Thanks!!
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
Thank you @Nitya1 for responding to this post. The solution shared by @Anil_G is working fine.
Appreciate your support.
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”
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
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
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
I appreciate the time and effort you invested to help on this. Thank you for your continuous effort.
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.