Lance Berkman went 1-for-3 and drove in the first two runs of the game, Carlos Lee went 3-for-3 and broke a long RBI drought with a two-run homer, and Miguel Tejada went 2-for-4 to extend his hitting streak to 15 games and take over the National League lead in batting (.353).
"It was just a good, clean win all the way around," Berkman said. "We had good pitching, played good defense and the bullpen did a good job. It's kind of how you draw it up."
Chris Sampson pitched a scoreless eighth, and LaTroy Hawkins earned his seventh save, his most in a single season since 2004.
Oswalt (2-2), who threw a one-hitter against the Rockies in his previous outing against Colorado in September of last year, improved to 7-1 lifetime against the Rockies with a 1.78 ERA and tied a season high by throwing seven innings.
"Whether it was his best outing, I don't know. But he was real good," Astros manager Cecil Cooper said. "I thought he was real crisp and kept the ball down and hit his spots real well, and he really finished off a lot of those innings really good. That's the Roy that I know."
Lee, who went 2-for-11 in the weekend series in Pittsburgh, hit a two-run homer in the sixth to give the Astros a 4-1 lead, marking his first RBIs in a span of 13 games (May 16). It was his longest RBI drought since joining Houston before the 2007 season.
"I would say these last two weeks have been the toughest two weeks of my career," Lee said. "I've always been able to manage to get an RBI here and there, even when I'm not hitting I'm producing. These last two weeks were really tough."
Oswalt had electrifying stuff, needing 102 pitches to get through seven innings. It was his longest outing since going seven innings April 27 at Cincinnati. He kept the ball down and didn't pitch deep into too many counts.
"No matter how long you play this game, you're going to run through a skid where you're not playing too well," said Oswalt, who won for the first time since May 10. "Some of the guys in the Hall of Fame ran into a few skids here and there. You take the good with the bad. You can only do so much. You just have to keep going out there and compete."
Berkman had a two-out RBI single in the first to score Hunter Pence, and he drove in Pence again in the fourth inning with a sacrifice fly. The two RBIs for Berkman briefly gave him the team lead at 31 before Lee's homer in the sixth off Rockies starter Aaron Cook (3-3).
"I felt great today at the plate," Lee said. "I don't know how that happens. You go from not seeing the ball at all to feeling good the next day. To be honest about it, I didn't do anything different. That's the craziness of this game."
Oswalt carried a shutout into the fifth inning before Todd Helton hit a high-arcing fly ball to right field that floated into the bleachers for a solo homer, cutting the Astros' lead to 2-1. The homer was the 12th allowed by Oswalt this year.
"He looked like he had good command and was keeping them off-balance, which I think is the key for him," Berkman said of Oswalt. "When he's able to throw his offspeed stuff over the plate and just off the plate when he needs to, that's the key, because then they have to cover more than the fastball."
Colorado managed just one other extra-base hit, a first-inning double by Clint Barmes. The Rockies were 0-for-5 with runners in scoring position.
"He'll give you an inch, but that's all you're going to get most of the time before he closes the door," Rockies outfielder Seth Smith said.
The Astros have won three of four, thanks to well-pitched games by Brian Moehler (Friday), Mike Hampton (Sunday) and Oswalt.
"That's what we need," Cooper said. "We need that in order to be successful. I'm not saying they have to go out and pitch shutouts, but keep us in the game and give us a chance."