India were skittled for 162 in 39.3 overs by the West Indies but the Caribbean islanders failed to punch home the advantage, losing by 16 runs.
It was India's first limited overs win since May and they must now beat Australia on Friday to make Sunday’s final. The West Indies have already qualified.
“Anything can happen in cricket and we never gave up,” said Indian captain Rahul Dravid.
“The boys were disappointed with their batting but I think our bowlers have been bowling very well, getting it in the right place. I'm very happy for them.”
While the West Indian bowling attack has proved effective at this tournament their batting has left much to be desired.
They fiddled with the line-up on Wednesday to give the underperformers a chance to shine, meaning opener Chris Gayle came in at six and captain Brian Lara at eight.
Lara admitted it didn't work, and it was a worry.
“It shows a few guys are out of form and lack confidence,” he said. “It's a cause for concern but I am very happy with our bowlers.”
Ajit Agarkar led the attack for India with Munaf Patel in place of Irfan Pathan who was dropped after poor performances in earlier games here.
Runako Morton, a controversial character who was arrested in January 2004 over a stabbing incident, opened with Shivnarine Chanderpaul and they started well enough, motoring to 44-0 before their nerves got the better of them.
Chanderpaul was the first to go, spooning a Patel delivery to Virender Sehwag at square leg for 21.
Patel pounced again to remove vice-captain Ramnaresh Sarwan for two, with an edge to wicket-keeper Mahendra Dhoni.
India were starting to believe in themselves when Morton was dismissed for 27 in the next over, with Dhoni taking a juggling catch off Shanthakumaran Sreesanth.
Agarkar, who had been hounding the batsmen with his pace and accuracy, finally got a wicket when he had Marlon Samuels lbw for five, leaving the West Indies tottering on 63 for four.
Gayle and Wavell Hinds, both experienced batsmen, needed to settle things down but it didn't work that way and Gayle went for one.
It brought Dwayne Smith to the crease and he was clearly under orders, smashing three boundaries in his first four balls before he was out lbw to Agarkar on his fifth.
Lara only came out at 97-7 and his unbeaten 40 gave them a glimmer of hope before he ran out of partners.
Harbhajan Singh was the pick of the Indian bowlers with 3-35. Patel, Agarkar and Sreesanth all took two each.
Earlier, scintillating fast bowling reduced India to 162 all out with only Sachin Tendulkar (65) offering resistance.
India struggled from the outset after winning the toss and electing to bat against a side buoyed by the return from injury of top fast bowler Corey Collymore.
He opened the attack with Smith and India were in trouble immediately.
Dravid fell to the third ball of the day without scoring, nicking a Smith delivery to a jubilant Carlton Baugh behind the stumps.
The tall, aggressive Smith was red-hot and knocked down another big gun in Sehwag in his next over, uprooting his off stump, then tempting Suresh Raina into a thick edge to Gayle at slip.
Smith also got Yuvraj Singh (0), bowling 10 straight overs to end with 4-31.
Scoreboard
INDIA:
R. Dravid c Baugh b Smith 0
S. R. Tendulkar run out 65
V. Sehwag b Smith 1
S.K. Raina c Gayle b Smith 11
Yuvraj Singh c Baugh b Smith 0
M.S. Dhoni b Collymore 18
A.B. Agarkar b Bravo 4
Harbhajan Singh c Baugh b Gayle 37
R.P. Singh b Gayle 2
S. Sreesanth run out 0
Munaf Patel not out 2
EXTRAS (LB-3, W-16, NB-3) 22
TOTAL (all out, 39.3 overs) 162
FALL OF WKTS: 1-1, 2-6, 3-38, 4-38, 5-69, 6-78, 7-156, 8-157, 9-160.
BOWLING: Smith 10-2-31-4 (3w); Collymore 8-1-41-1 (8w); Gayle 5.3-0-13-2; Samuels 4-0-17-0 (1w); Bravo 6-0-16-1 (2w); Hinds 6-0-41-0 (3nb, 2w).
WEST INDIES:
S. Chanderpaul c Sehwag b Patel 21
R.S. Morton c Dhoni b Sreesanth 27
R.R. Sarwan c Dhoni c Patel 2
W.W. Hinds c and b Harbhajan 8
M.S. Samuels lbw b Agarkar 5
D.H. Bravo st Dhoni b Harbhajan 10
C.H. Gayle lbw b R.P. Singh 1
D.R. Smith lbw Agarkar 12
B.C. Lara not out 40
C.S. Baugh c Dravid b Harbhajan 6
C.D. Collymore lbw b Sreesanth 0
EXTRAS (LB-6, W-6, NB-2) 14
TOTAL (all out, 40.5 overs) 146
FALL OF WKTS: 1-44, 2-52, 3-58, 4-63, 5-70, 6-83, 7-96, 8-118, 9-144.
BOWLING: Agarkar 10-1-22-2 (2nb, 1w); Munaf Patel 10-1-31-2; Sreesanth 8-0-25-2; R.P. Singh 5-0-27-1 (2w); Harbhajan Singh 8-0-35-3 (2w).
RESULT: India won by 16 runs.
UMPIRES: M.R. Benson (England) and A.L. Hill (New Zealand).
TV UMPIRE: Asad Rauf (Pakistan).
MATCH REFEREE: B.C. Broad (England).
MAN-OF-THE-MATCH: Harbhajan Singh.
NEXT MATCH: Australia v India on Friday.
—AFP