魏國大將軍曹真收複南安、天水、安定三郡後,自恃有功,上疏請求從斜穀攻打蜀國。曹叡依從曹真,命大將軍司馬懿與曹真一起攻打漢中。司空陳群上疏說,斜穀地勢險要,糧餉運輸艱難,不應采取曹真的建議。曹叡將此話轉告曹真,曹真請求從子午穀進兵,陳群又不讚成。曹真不等曹叡下令,立即動身。諸葛亮接到警報,領兵前往漢中,令軍隊分別駐紮在成固、赤阪,然後讓李嚴率兵兩萬,到漢中會師,令李嚴的兒子李豐為江州都督,接替李嚴。當時正值秋雨連綿,山穀水滿,曹真從長安出發,在途中逗留多日,一個多月了也沒能到達子午穀。魏國太尉華歆、少府楊阜、散騎常侍王肅等人接連請求班師,曹叡於是召回曹真。司馬懿向來乖刁,他以天降大雨為借口,按兵不動。諸葛亮派魏延西入羌中,招撫羌人。魏廷與魏國雍州刺史郭淮在陽溪交戰,魏延大獲全勝。
當時,蜀國長史張裔病死,諸葛亮提升蔣琬為長史。蔣琬,字公琰,祖籍湘鄉,曾跟隨劉備進入蜀地,被封為廣都長。蔣琬上任後,不理政務,劉備想將他誅殺。諸葛亮十分欣賞蔣琬的才能,代為求情,蔣琬才得以安然無恙。後主繼位,諸葛亮就舉薦蔣琬為參軍,擔任長史。諸葛亮每次出兵,都令蔣琬籌備糧餉。建興九年春天,諸葛亮再次起兵討伐魏國,進攻祁山。曹真當時已被提升為大司馬,由於抱病在床,不能領兵,於是調司馬懿屯兵長安。不久曹真去世,兒子曹爽襲封。司馬懿手握軍權,讓部將費曜、戴陵率領四千精兵防守上邽,自己偕同張郃等人去解救祁山。張郃請求分兵把守雍、郿二地,司馬懿認為兵力分散,容易被敵兵打敗,不肯聽從。諸葛亮聽說司馬懿親自前來支援,偏偏不去迎戰,隻留下王平攻打祁山,自己率領魏延、薑維等從小路攻打上邽。上邽守將費曜、戴陵倉皇出戰,哪裏是蜀兵的對手,四千人幾乎全軍覆滅,多虧雍州刺史郭淮領兵支援,才得以保住城池。自此以後,兩位大將閉城堅守。當時正值麥子成熟,諸葛亮令將士出去割麥,作為軍糧。郭淮等人不敢出戰,隻派人稟報司馬懿,催促他回來支援。司馬懿急忙調頭回來。
走到上邽城東,恰逢魏延、薑維率兵殺來,司馬懿立即下令軍中,隻許放箭,不許迎戰。魏延、薑維左右夾攻,都被魏兵射退,隻好收兵回營。司馬懿依靠險要的地勢堅守,任憑蜀國的將士如何叫戰,就是不肯出兵。諸葛亮領兵回到鹵城,司馬懿反而從後麵緊逼,在鹵城東邊紮營。諸葛亮派魏延、高翔、吳班等人分頭埋伏,自己前往司馬懿營中挑戰,司馬懿仍然不出戰,任憑蜀兵在營外百般辱罵,司馬懿始終置若罔聞。這下惹惱了大將張郃,他進帳對司馬懿說:“蜀兵遠道而來,知道不交戰對我軍有利,一定會設法圍困我們。如今不如與他決一死戰,如果打勝,他們自會退去,祁山也就解圍了。”司馬懿搖頭說:“諸葛亮的軍糧較少,堅持不了多久自會退兵。那時我們再去追擊,定能獲勝,何必急著交戰呢?”正在這時,有兩個人進來說:“蜀兵又來挑戰了!”司馬懿接口說:“讓他們挑戰吧,我偏偏按兵不動,看他有什麼妙計!”二人齊聲說:“人們都說你畏懼蜀兵,豈不可恥?況且我軍比蜀兵人多,難道就不能作戰嗎?”司馬懿被他一激,也有些忍耐不住,對二人說:“既然如此,傳令決戰。”二人得到命令,向各營通報。這二人叫賈栩、魏平,年少氣盛,接到命令之後,便摩拳擦掌,專等上陣殺敵。
過了兩天,司馬懿召集眾將:“要攻打蜀軍,必須兵分兩路,一路攻打鹵城,一路解救祁山。隻有讓他們來不及支援對方,我們才能成功。”張郃應聲說:“我願意去祁山。”司馬懿調撥一萬人,讓張郃帶領著去攻打祁山,自己率軍出去作戰。諸葛亮聽到司馬懿營中的鼓聲,便將妙計告訴魏延、高翔、吳班三員戰將,囑咐他們分頭行事,自己率領大軍出城,從容等待。過了一會兒,司馬懿領兵過來,諸葛亮令前軍用連臂弓擋住司馬懿。連臂弓是諸葛亮發明的,一次能接連射出十支箭,司馬懿的部隊雖然強悍,但也擋不住,士兵都被射倒。司馬懿的銳氣大挫後,蜀軍中響起號角,頓時有千軍萬馬向司馬懿猛撲過來,司馬懿忙率領眾人攔截。剛剛交鋒,又殺來一隊人馬,領頭的是蜀國大將高翔。司馬懿立即分兵抵擋,堅決不退。誰知身後喊聲大起,吳班率兵殺到。司馬懿頓時心驚,領兵退回。蜀兵三路兵馬一起追擊,司馬懿邊戰邊逃。逃到半路,又遇到一隊人馬,為首的一員大將大叫:“魏延在此!”嚇得司馬懿魂飛魄散,幾乎墜落馬下。幸虧驍將賈栩、魏平等人在司馬懿身邊保護,司馬懿才得以逃脫。這次交戰,蜀兵斬殺魏兵三千人,獲得鎧甲五千件,兵器不計其數。
司馬懿逃回營中後,堅守營寨,不敢再戰。張郃得知司馬懿戰敗,也立即退回,雙方又相持了一個月。魏國大將郭淮調集雍、涼精兵,打算從小路襲擊劍閣。諸葛亮得知後,派薑維、馬岱等人帶兵守住險要關口。長史楊儀上報說有八萬士兵,其中有四萬人按慣例應該更替,但是新兵還沒到,難以交接,隻得再等一個月,才能將這四萬人遣回。諸葛亮微笑著說:“我自領兵以來,從不曾失信。如今既然到了更替的時候,理應照例將他們遣回。應該回去的將士,想必已經整裝待發,他們家中的父母妻子都在盼望著,就算大敵當前,我也不能失信,讓他們如期回去吧。”楊儀將諸葛亮的命令傳出去,可軍中的老兵都不願意離開,希望繼續留在營中作戰。正在這時,李平派人到來,參軍狐忠、督軍成藩呈上李平的書信,請諸葛亮立即班師。諸葛亮不免驚疑,但轉念一想,李平為人老成,他如果要班師,其中必有原因,且李平正負責運輸糧草,糧草如果跟不上,也難以行軍打仗,諸葛亮於是決定退回。先派狐忠、成藩回去稟報,然後召集將士,將退兵的意思告他們,並且說如果魏兵追來,應當奮力抵抗。將士很想再戰,聽到班師的命令,都有些失望。諸葛亮又說:“你們肯努力殺敵,我還有什麼話說。但一味蠻打也不行,我們應當把敵兵誘到木門道,再全力圍攻,就算他們有千軍萬馬,也不能脫逃。”於是派人到祁山,囑咐老將王平乘夜部署,自己從鹵城出發,從容地返回漢中。