12

I'm using Powershell on Windows XP and am trying to write a command that will:

1. read all .bat,.cfg, and .config files
2. replace a string (it's actually the path...these files were all moved)
3. overwrite the existing files with the new one (same name, same location, etc.)

I am not a Powershell user, but I have managed to piecemeal the following together:

gci -r -include "*.bat","*.config","*.cfg" 
    | gc 
    | foreach { $_ -replace "D:","C:\path" } 
    | sc ??.FullName

I'm fairly certain that I've taken care of #1 and #2, but am having trouble figuring out #3 (passing the filename to variable that can be referenced in sc). Any thoughts? Also, let me know if you need any additional information.

EDIT:

I managed to work out an answer (see below), but is there a better way to do this?

3 Answers 3

17

try:

gci -r -include "*.bat","*.config","*.cfg" |
 foreach-object { $a = $_.fullname; ( get-content $a ) |
 foreach-object { $_ -replace "D:","C:\path" }  | 
set-content $a }
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks! It works, though you missed a bracket after "C:\path".
Okay, this is a good fix, but the indenting here is really really difficult to read. If you leave a brace open, please indent!
When I tried this, a BOM marker was added to the modified files.
4

If you want to use the above code on ALL FILES use this code, note the top line:

gci -r *.* |
foreach-object { $a = $_.fullname; ( get-content $a ) |
foreach-object { $_ -replace "master81","master" }  | 
set-content $a }

if you leave out *.* you may get errors because you are trying to edit folders.

[Get-Content], UnauthorizedAccessException

Comments

0

I recognized that I needed an extra variable. One way to do this is by integrating a for-loop into the outer portion of the command. I used:

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) |
       foreach { $_ -replace "D:","C:\path" }  |
       sc $f.fullname 
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.