user982201
user982201

Reputation: 71

Powershell script to replace strings with filename

How do I write the filename (basename and not the fullname) into the same file by replacing a string present in the file. Basically, I have a bunch of .psf files inside a folder called C:\Downloads\PreValidation.

  1. I want to change each file to a .csv format and
  2. while doing so I want to replace the string called 'Space Planning Project' present inside one of the records of the file with the filename without the extension.

This is the script that I am trying to run -

foreach($file in (dir C:\Downloads\PreValidation\*.psf)){
$fromdir = "C:\Downloads\Prevalidation\*.psf"
$fullname = gi $fromdir| select fullname
$b = $fullname[0]
$b.fullname
Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv
Get-Content C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv 
}

but its erroring out saying

 Get-Content : Cannot find path 'C:\Downloads\Validation\WIP\psaload.csv' because it  does not exist.
 At C:\cap_sps\powershell\testfilename.ps1:7 char:12
 + Get-Content <<<<  C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object  {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv
+ CategoryInfo          : ObjectNotFound: (C:\Downloads\Validation\WIP\psaload.csv:String) [Get-Content], ItemNotF
oundException
 + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Note that I am using my final psaload.csv to load into an Oracle database and in the last step of my script I am removing this file so that I can run the same commands in loop for the rest of the .psf files present in the above folder.

Any help is deeply appreciated.

Thanks, Sanders.

Upvotes: 0

Views: 3600

Answers (2)

manojlds
manojlds

Reputation: 301587

There is a lot of redundancy in your code, with the dir in the loop and then using the file to get the item again. Also you are copying to the same csv file for each of the psf files and the copy line mentions a file psaload1.csv, but you are trying to get the content of psaload.csv, causing the error that you see.

Try something like this ( I am making some assumptions here and untested):

gci C:\Downloads\PreValidation\*.psf | %{
$file = $_
gc $file.fullname | % {$_ -replace "Space Planning Project",$file.BaseName } | Set-Content "C:\Downloads\Validation\WIP\$($file.BaseName).csv"
}

Upvotes: 4

zdan
zdan

Reputation: 29480

To get the BaseName of a file object , use the BaseName property. You can modify your script like so:

$files = gi $fromdir| select fullname,basename
$fullname = $files[0].fullname
$b = $files[0].basename

As for the error message, you are trying to retrieve the contents of a file that does not exist. Your copy line

Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv

has a "1" in the file name, but in the next line, your filename to Get-Content does not.

Upvotes: 0

Related Questions