Cristiano Ronaldo scored one and set up another for Nani as Portugal ended the Wales fairy-tale to reach the Euro 2016 Final.
This 2-0 result was remarkably their first victory within 90 minutes at the tournament, but they will face France or Germany next Sunday in Paris for the trophy.
It was an unexpected path to the semi-final for both sides, as Wales topped the group ahead of England and swept Belgium aside 3-1 in their first ever European Championship. Portugal scraped through third after three draws, beating Croatia in extra time and Poland on penalties.
Ben Davies and Aaron Ramsey sat out bans for Wales, while Portugal had William Carvalho suspended and Pepe injured. It was a huge clash between Real Madrid teammates Gareth Bale and Cristiano Ronaldo in Lyon.
Curiously, both teams were wearing their away kits. James Collins got away with an early tug on Ronaldo’s neck in the penalty area, while Joao Mario drilled wide.
Bale turned over from a corner and then blasted a solo effort at the goalkeeper. The tempo slowed considerably towards half-time and Ronaldo’s header off target was a rare bright spot.
Wales had seemed to take the initiative more, but Portugal broke the deadlock with Cristiano Ronaldo’s towering header from Raphael Guerreiro’s cross on a short corner. It was his ninth goal in European Championships, equalling Michel Platini’s record.
Moments later it was 2-0, as Ronaldo’s wayward shot turned into an assist for Nani to slide in from seven yards.
Ronaldo skimmed the crossbar with a free kick, then Wayne Hennessy parried a Nani effort into the path of Joao Mario only for the follow-up to go wide.
Bale tested Rui Patricio with a couple of ferocious snapshots from distance, but Hennessy had to scramble back and block Danilo’s shot on the line after initially letting it squirm under him.
Ronaldo risked adding a third late on, but Hennessy did enough to narrow the angle and he only hit the side-netting.
Portugal 2-0 Wales
Ronaldo 50 (P), Nani 53 (P)
Portugal: Rui Patricio; Cedric, Bruno Alves, Jose Fonte, Guerreiro; Joao Mario, Danilo, Adrien Silva (Joao Moutinho 79); Renato Sanches (Andre Gomes 74); Nani (Quaresma 87), Cristiano Ronaldo
Wales: Hennessy; Gunter, Chester, Collins (J Williams 66), A Williams, N Taylor; Allen, Ledley (Vokes 58), King; Bale, Robson-Kanu (Church 63)
Ref: Eriksson (SWE)