建興八年秋,曹真請求出兵討伐蜀國,曹睿便拜曹真為大司馬、征西大都督,司馬懿為大將軍、征西副都督,劉曄為軍師,率兵四十萬,出長安攻打漢中。當時,蜀漢丞相諸葛亮也正準備再次北伐,得知曹真、司馬懿率兵打來的消息,令王平、張嶷先行駐守陳倉道口,自己率大軍隨後接應。王平、張嶷知魏兵人多勢眾,不敢前去,諸葛亮說道:“幾天之後將有一場大雨,魏軍不敢冒雨深入山區險地,你們放心去吧。等他們退走時,我率大軍隨後掩殺,必然大獲全勝。”王平、張嶷依令而行。諸葛亮隨後率大軍趕往陳倉。
曹真、司馬懿也來到了陳倉。司馬懿說道:“我夜觀天象,預知將有一場大雨,因此不能急於進兵,就先在陳倉城住下吧。”曹真便令大軍駐紮在陳倉城。沒過幾天。果然下起了大雨,一連下了一個多月,陳倉城裏到處都是積水,魏軍將士連睡覺的地方都沒有,怨聲載道。曹睿得到消息,召集文武百官商議,黃門侍郎王肅等人建議傳旨班師回朝,曹睿便令曹真、司馬懿退兵。曹真、司馬懿接到命令,埋伏下兩支兵馬負責斷後,然後就退兵了。諸葛亮在魏兵還沒有退走的時候,就料定魏兵將要撤退,於是決定趁著魏軍退走之際,出兵攻打祁山。
司馬懿見蜀軍沒有追來,料定諸葛亮已經率兵攻打祁山去了,曹真不信,司馬懿說道:“我料定諸葛亮必然從箕穀、斜穀分兵而出。我與都督各自把守一個穀口,十天之內,如果蜀軍不來,算我輸;如果蜀軍趕來,算都督輸。”曹真同意了,令司馬懿駐守箕穀,自己駐守斜穀。
魏延與張翼、陳式、杜瓊率兩萬大軍從箕穀進軍,諸葛亮命鄧芝傳令,讓他們小心提防,不要中了魏軍的埋伏。陳式不聽,一馬當先率五千兵馬往祁山而來,走不多遠,果然中了埋伏,陷入重圍,幸虧魏延殺到,才救了他的性命,五千兵馬隻剩一成。諸葛亮得知陳式戰敗,令王平、馬岱巡視斜穀,如果發現有魏軍把守,日夜兼程趕到祁山左側舉火為號;令張翼、馬忠趕到祁山右側舉火為號,然後與王平、馬岱會合,襲取曹真的營寨;又交給關興、廖化、吳班、吳懿四將一條密計,令他們依計而行。