MILWAUKEE -- Ben Sheets was shaky, and Pittsburgh did everything it could to wear him out.
The Pirates just couldn't get a big hit against Milwaukee's ace.
Sheets labored through 5 2/3 innings to earn his 10th win, J.J. Hardy and Bill Hall each hit a two-run homer and the Brewers beat Pittsburgh 9-1 on Friday.
The Pirates were miserable with men on. They went 1-of-12 with runners in scoring position and stranded 12 total, including eight against Sheets, who is having the best season of his eight-year career.
"It was a rough day for me," Sheets said. "If I could've made better pitches, I could've put them away sooner. I'm trying out there."
Sheets (10-2) stranded eight runners in the first five innings, allowing one run and eight hits before departing in the sixth after throwing 120 pitches.
"We did our job as far as getting his pitch count up, we didn't do our job as far as driving guys in," Pirates manager John Russell said.
Sheets became the sixth 10-game winner in the NL this season, thanks to Hardy, Hall and a five-run fifth inning.
Hardy, who struggled with a tight shoulder last month that forced him out of the lineup for a week, had four hits for the second straight day to extend his hitting streak to 16 games, the longest active streak in the majors. He's now batting .448 with six homers and 16 RBI during his streak, and the homer in the fifth set off Milwaukee's offensive outburst.
"My shoulder's been feeling good and it's just been falling for me," Hardy said. "This is definitely up at the top with my hottest streaks ever."
Tom Gorzelanny (6-7) walked Sheets, a career .077 hitter, and got Rickie Weeks to fly out before Hardy's drive deep to left field made it 5-1.
"That's definitely not what I planned on doing," Gorzelanny said of walking Sheets. "I was progressing, and then to have a game like that today, it's just unfortunate. Unfortunate things happened today, I didn't throw the way I planned and it showed."
Gorzelanny picked off Ryan Braun after a walk, but failed to get another out.
Prince Fielder snapped an 0-for-13 skid with a bloop double, advanced to third on a wild pitch and scored on Corey Hart's single.
After Mike Cameron walked, Hall, who drove in three runs, singled in Hart and Gorzelanny's defense failed him when left fielder Jason Bay made an errant throw to third base, allowing Cameron to score on a nifty slide past Ryan Doumit's tag to make it 8-1.
Gorzelanny, who gave up 11 hits, was yanked after his fourth walk of the inning. But he didn't get any run support with Pittsburgh leaving two runners on in four different innings and only scoring once on Xavier Nady's RBI double with two outs in the third.
It was a good start to the Brewers' 10-game homestand after they lost a five-run lead in the ninth on Thursday in Arizona.
"You get mad and upset, but you realize you better forget it," Brewers manager Ned Yost said.
Hall, who faces lefties as part of a third base platoon with Russell Branyan, made sure they forgot quickly. He drove the first pitch he saw into the Brewers' bullpen to give Milwaukee a 2-0 lead in the second. He also scored on Jason Kendall's two-out single in the fourth to make it 3-1.
"I'm starting to get some confidence back," said Hall, who acknowledged he's accepted his platoon role after hinting he wanted to be traded. "I've been searching for a little while now, I think I'm starting to find some stuff."