Centuries from Shreyas Iyer and KL Rahul powered India to a 160-run World Cup win over the Netherlands on Sunday as they completed the group stage with a perfect nine wins in nine games.
Iyer (128 not out) and Rahul (102) put on 208 runs to guide India to 410-4.
India then employed nine bowlers, including part-timers Virat Kohli and Rohit Sharma, to dismiss the Dutch for 250 in the tournament's concluding league match in Bengaluru.
The hosts will face New Zealand in the first semi-final in Mumbai on Wednesday followed by the second last-four clash between Australia and South Africa the next day in Kolkata.
Iyer smashed his first World Cup ton in a match where all the top-five Indian batsmen went past the fifty mark on a batting-friendly pitch.
He reached his hundred -- his fourth in ODI cricket -- off 84 balls. He ended with 10 fours and five sixes.
Bengaluru-born Rahul raced to his ton with two sixes for the fastest Indian hundred in World Cups off 62 balls.
He departed four balls later as India fell short of their highest ever World Cup total of 413-5 v Bermuda in 2007.
Kohli reached his half century but fell for 51, silencing the crowd who had been anticipating the star batsman's 50th ODI ton after he equalled Sachin Tendulkar's record of 49 in the team's previous win over South Africa.
Skipper Rohit, who hit 61, and Shubman Gill laid the foundations for the total in an opening stand of 100 with the pair hitting regular boundaries.
Gill fell for 51 off Paul van Meekeren and fellow quick Bas de Leede dismissed Rohit after the captain reached his fourth 50-plus score including a ton in the tournament.
Bas overtook his father Tim de Leede, who took 14 wicket for the Dutch in the World Cup, and claimed one more to finish as the highest World Cup wicket-taker for his nation with 16 scalps.
The in-form Kohli reached the 71st ODI fifty of his career only to be bowled four balls later by Roelof van der Merwe's left-arm spin.
Kohli surpassed South Africa's Quinton de Kock (591) as the leading batsman of the 2023 tournament with 594 runs.
Iyer kept up his blazing form to register his fourth successive score of 50 and above in the tournament and received support from the other end with Rahul joining the charge.
In reply, the Dutch were never in the chase and kept losing regular wickets including Kohli striking with the his gentle medium-pace to claim a first ODI wicket in nine years.
With the Dutch crawling in their reply, Rohit threw the ball to Kohli who sent back opposition captain Scott Edwards, caught behind in his second over off a ball drifting down the leg side.
It was only Kohli's fifth career ODI wicket from his gentle medium-pace and first since 2014.
Sybrand Engelbrecht made 45 and Teja Nidamanuru hit 54 before the innings folded in 47.5 overs with Rohit ending using his part-time off spin to send back Nidamanuru.
Rohit last picked an ODI wicket in 2012 and this was only his 10th career wicket.