The home side looked more dangerous in the first half, but it was certainly a different story after the interval.
Michael Jacobs and John Marquis were both denied by fine Pontus Dahlberg saves, while the keeper then kept out a spot-kick from substitute Williams.
Danny Cowley made three changes from the side that beat Shrewsbury on home soil earlier in the week.
Joe Morrell was handed a first start in the centre of midfield, while there were also returns for Connor Ogilvie and Gassan Ahadme.
Williams and Lee Brown both dropped to the bench, but Marcus Harness (quad) missed out through injury.
There was a quick reunion with academy graduate Ben Close, who appeared in midfield for the hosts.
The hosts were dealt an early blow when skipper Tom Anderson went down injured and had to be replaced in the centre of defence by Branden Horton.
But it was Rovers who looked the more dangerous side before the break, with Tiago Cukur not quite able to turn home Charlie Seaman’s teasing delivery.
They thought the deadlock had been broken after Close had picked out Tommy Rowe in the Pompey box.
His first attempt was brilliantly saved by Gavin Bazunu and although the second was tucked away, the linesman was flagging for a foul on Clark Robertson.
Close was looking a particular threat and dragged one good opportunity wide before seeing another well saved by Bazunu.
The Blues, meanwhile, were still looking to make a real impact on proceedings, having been forced onto the back foot.
A cross from Kieron Freeman was angled over the bar by Ronan Curtis, who later tried to make Ro-Shaun Williams pay for dallying on the ball.
Curtis also hit a firm 35-yard free-kick through the Doncaster wall, but straight into the arms of Dahlberg.
The keeper had drawn a few groans for sending some goal-kicks out of play and there were ironic cheers when he managed to keep one on the pitch.
Pompey’s best chance came just before the break, as Robertson met Reeco Hackett-Fairchild’s corner, but could only manage to divert the ball into Dahlberg’s arms.
Doncaster Rovers 0
The visitors had a chance soon after the interval, when Gassan recovered from taking a heavy touch to find Curtis in the box.
He met the ball with a neat flick, but Dahlberg did well to get down quickly and stop the ball finding the net.
Pompey were still struggling for fluency, however, and Cowley decided the time was right to make a change just before the hour mark.
It came in the centre of midfield, where Morrell was withdrawn and replaced by the evergreen Williams.
And a second switch followed a few minutes later, with Jacobs coming on for the tireless Hackett-Fairchild.
He almost gave the visitors the lead on 67 minutes following a frantic spot of pinball in the Doncaster box.
The ball eventually fell to Jacobs and he hit a shot through a sea of bodies and towards the net, only for Dahlberg to get down and make a fine stop.
But the keeper then made an even better save to deny Marquis from point-blank range after a Williams corner had been nodded back into the centre by Sean Raggett.
The danger was not over, though and when the ball was sent into the box again, Gassan’s header looped just over.
Pompey were suddenly looking really dangerous, but the otherwise faultless Bazunu almost spilled a Seaman shot into the net and had to grab it at the second attempt.
Cowley’s final change followed on 74 minutes, with Marquis applauded off by both sets of supporters and replaced in attack by George Hirst.
The Blues should have gone in front late on, as Bazunu’s long pass forward found Gassan in the box and he was clumsily bundled to the turf.
Referee Carl Boyeson immediately pointed to the spot, but Williams’ penalty lacked power and Dahlberg went the right way to keep it out.
The game remained incredibly open, however, and it was still Pompey on the front foot, looking to turn one point into three.
But Doncaster almost grabbed a late winner themselves, as Branden Horton’s effort bounced into the turf and was looping into the net before a back-pedalling Bazunu managed to tip it over.
The Blues kept piling on their pressure throughout seven minutes of additional time, but could not force a way through.
Doncaster (4-2-3-1): Dahlberg; Knoyle, R.Williams, Anderson (c) (Horton 12), John; Bostock (Smith 69), Galbraith; Seaman, Close, Rowe; Cukur (Gardner 87)
Booked: Bostock, Knoyle
Subs not used: Jones, Blythe, Barlow, E.Williams
Pompey (4-2-3-1): Bazunu; Freeman, Raggett, Robertson (c), Ogilvie; Tunnicliffe, Morrell (Williams 59); Hackett-Fairchild (Jacobs 62), Gassan, Curtis; Marquis (Hirst 74)
Booked: Marquis, Jacobs
Subs not used: Bass, Downing, Brown, Harrison
Referee: Carl Boyeson
Attendance: 6,660 (1,292 Pompey fans)