渭南之戰後,關中聯軍慘敗,主力折損殆盡,關中地區對於中央政權的軍事威脅基本上消除了。然而,馬超、韓遂等關中諸將並不甘心於失敗,於是又四處蒐羅殘兵餘部,並聯合少數民族各部,接連發動了一系列的叛亂,所幸規模都不算大,均被曹軍名將夏侯淵所擊潰。時至建安十九年(214年),曹軍已完全控制了隴右、河西等涼州之地,消除了南下進攻漢中張魯集團的側翼隱患。此前,曹操分別在建安十七年(212年)十月到次年四月和建安十九年七月到十月發動了兩次針對孫權集團江北軍事要塞濡須口的大規模進攻,雖未取得什麼實質性的戰果,卻也對孫權造成了一定的威懾,使之不敢輕舉妄動,從而穩固了曹操集團的東線形勢。而地處西南的劉備集團掌控了蜀地,實力空前膨脹,隨着對外擴張地進行,勢必將乘勢攻取漢中。正是在這種局勢下,曹操才果斷決定,發動了這次消滅張魯、佔領漢中的戰役,藉以遏制劉備集團的北進勢頭。
建安二十年(215年),曹操親自統率大軍進攻張魯。三月,曹操大軍抵達陳倉故道。此時位於涼州武都郡的氐人,阻塞道路,曹操先派出張郃、朱靈部,擊破了進入武都沿途的氐人。四月,大軍自陳倉出散關進兵到達武都的河池一帶,“氐王竇茂衆萬餘人,恃險不服”,曹軍再次受阻。五月,曹軍經過激戰,攻克了西北軍事重鎮河池,從而打通了南下漢中的戰略通道。七月,曹操主力終於到達漢中的西部前沿陽平關一帶。熟悉三國地理的朋友都知道,漢中通往關中的道路很多,但大體分爲兩大類,其一爲穀道,如,子午谷、斜谷等;其二爲古棧道,以陳倉故道最爲著名。穀道道路艱險難行,不利於大兵團的推進,但是谷口沒有敵人的險關,敵軍一般只是依託山勢進行防禦。而陳倉故道剛好相反,道路相對平坦,利於步騎通過,但需要強攻陽平關。曹操選擇了後者,大概也是看中了陳倉故道便於騎兵和重步兵的推進,同時可以減少千里襲人給曹軍帶來的路途勞頓。是役,曹軍動用的兵力大致是十萬左右;而張魯方面的總兵力也應在五萬人上下。也許是出於自信或是對漢中地形的陌生,曹操所統帥的十萬大軍採取了一路集中進攻的部署,而沒有采取在秦嶺的其他穀道分路合擊的進軍策略。
當曹軍到達陽平關時,張魯的弟弟張衛,帶領大將楊昂、楊任和數萬兵馬,依託陽平關南北二山之間的險要地形,修築了長達十餘里的防禦工事。曹軍也不甘示弱,在抵達佔地後隨即展開猛攻。數日之後,由於地形險要、防禦堅固,曹軍在付出了很大的傷亡之下,依然毫無進展。曹操於是決定假裝撤退,以麻痹張魯的守軍部隊。果然,張衛等人得知曹操攻關不下,已經全線撤退,就放鬆了陽平關一線的戒備。此時,曹操突然殺了個回馬槍,密遣解忄剽、高祚兩將率部乘險夜襲。正巧半路驅趕了數千只野糜衝入了張衛的營壘,導致其防禦工事的損毀,結果曹軍趁虛而入,佔領了部分敵軍營壘,同時鼓角齊鳴,給張衛造成了曹軍主力全線突破的假象,張衛匆忙之間,難以辨別情況,只好棄陣而逃。陽平關就此掌握在了曹軍的手中。
漢中的西大門陽平關告破意味着曹軍可以**、直抵陝南,漢中也就不可守了。此時,張魯打算就此向曹操投降,但是其功曹閻圃建議道:“今以迫往,功必輕;不如依杜濩、赴樸胡相拒,然後委質,功必多。”張魯認爲有理,就率衆逃往了巴郡。臨走時,有人建議燒燬漢中等地的倉庫,但是張魯認爲:“本欲歸命國家,而意未達。今之走,避銳鋒,非有惡意。寶貨倉庫,國家之有。”於是把所有的倉庫加以封存,可見張魯還是很愛百姓的,不愧是張天師的後人。
同年七月,曹軍進駐漢中首府南鄭,曹操得知倉庫完好,軍糧無憂,感佩張魯作爲,即派使者前去勸慰張魯。並恢復漢寧郡爲漢中郡,又從漢中分出安陽、西城爲西城郡,置太守;分錫、上庸郡,置都尉。九月,巴中一帶七姓夷王樸胡、賨邑侯杜濩等率族歸順曹操。十一月,張魯亦率部出降。曹操拜張魯爲鎮南將軍,封閬中侯,食邑萬戶,封他的五個兒子及謀士閻圃爲列侯。
曹操取得漢中、巴中等地後,丞相主簿司馬懿及謀士劉曄都建議乘勝進兵益州,滅劉備,除後患。曹操認爲不能“得隴望蜀”,便以“關隴未穩,東吳孫權常舉兵攻合肥,恐深入蜀中作戰難返”爲理由,於當年十二月自率軍隊,並帶走漢中民八萬戶,北迴鄴都,留徵西大將軍夏侯淵、張郃、徐晃等駐守漢中。
劉曄、司馬懿“速攻巴蜀”的建議是否可行?曹操是否真的錯過了一舉收復蜀地的機會呢?這個問題歷來是史學界爭論的問題之一。一種意見認爲曹操確實錯過了大好時機,屬於戰略性決策失誤,而另一種意見則認爲曹操的決策是完全正確的,以當時的兵力和戰役準備,在短時間內根本不可能攻蜀成功。飛刀認爲後一種的評價更爲客觀合理一些。其原因有四:其一,當時曹軍已連續在險峻的山地行軍作戰達五個月之久,部隊已經相當疲憊,戰鬥力明顯下降。在此情況下,不經休整,就要連續發動大規模的進攻蜀地的戰役,又要經歷數月的山地行軍,困難很大,何況對手是以逸待勞的梟雄劉備,勝算不大;其二,曹軍進攻漢中,其糧草基地必然設在關中地區,一旦深入蜀地,僅憑張魯所剩的糧草,根本沒有辦法滿足大軍的需求,何況還有投降的張魯部隊也要吃飯。因此,曹軍的糧草供應主要還是要來自關中,這樣就必須隔着險峻的秦嶺向前線運送糧草,困難重重不說,而且漢中這塊剛剛征服而尚未完全平定的土地,將成爲曹軍運糧的唯一通道,一旦投降的漢中勢力與西川劉備集團串通,曹軍將死無葬身之地。其三,東吳勢力常常侵擾合肥等地,一旦曹軍深入蜀中,兵少了,難以攻克;兵多了,勢必造成中原空虛。以當時的生產力和文明水平,誰能牢牢佔據中原,誰就可以統一天下,只是一個時間的問題罷了。冒險深入蜀地,就顯得有點捨本逐末了。其四,曹操集團內部也因爲政治見地的不同而出現了一定地分歧,曹操長年暴兵在外不利於其加強統治,劉備與孫權固然有一定的實力,但根本上威脅不到曹操的統治地位,而曹的真正威脅則是在於其集團內部。深入益州腹地,遠離中原,一旦後方有事,救援不及。這些都是曹操所不得不考慮的問題。倘若沒有赤壁之敗,曹操還有可能孤軍深入,但赤壁之戰使得曹操知道了孫、劉兩股勢力對抗中央的決心非常堅決,且形成了一定的氣候,是很難催然攻取的。司馬懿及劉曄的建議過於依賴於敵人自動瓦解之上,缺乏後續的反制手段,這是很不合理的。因此,在當時的情況下,曹操的決策應該說是穩妥和正確的,不應全部歸因於其保守畏戰。