建安二十年四月,曹操亲自率领十万大军从陈仓出散关,进抵河池(今陕西省凤县西北),曹操命令部队击败了氐王窦茂的上万部众,全部将其屠杀。此时,遥远的河西也传来了好消息:西平、金城诸将麴演、蒋石等人一起诛杀了韩遂,将其人头送到了曹操军中!据《三国志·张既传》注引《魏略》、《典略》记载,韩遂在湟中时,他的女婿阎行想要杀死他,韩遂叹息道:“大丈夫处于危难之中,亲戚之间竟然也会拔刀相向!”他对心腹成公英说:“如今亲戚背叛,部众离散,我将取道羌族聚居区前去益州。”成公英说:“起兵数十年,如今虽然失败了,哪有去依附别人的道理?”韩遂说:“我老了,你说该怎么办?”成公英回答:“曹公不能长途跋涉来到此地,这里只有夏侯渊而已。夏侯渊的军队不足以追击我们,又不能久留此地,暂且前往羌族聚居区内休养生息,静待他撤军而去,然后,再召集旧部,联合羌族和匈奴族人,还能有所作为。”韩遂采纳了他的建议。当时,韩遂的身边尚有数千男女,韩遂素来对羌族人有恩,到了羌族部落以后,韩遂等人就受到了他们的保护。等到夏侯渊从陇西撤军后,留下阎行驻扎在陇西一带,韩遂又纠集了数万少数民族部众反攻,但不久韩遂就死掉了,成公英也只好投降了曹操,被曹操拜为军师,封为列侯。韩遂死时年龄七十多岁。
七月,曹操来到了阳平关(今陕西省勉县西)。经过长途跋涉,曹操看到了这里的穷山恶水,61岁的曹操想到自己戎马倥偬一辈子,尚未完成统一大业,不禁心乱如麻,他挥笔写下了两首《秋胡行》:“晨上散关山,此道当何难!牛顿不起,车堕谷间。 坐磐石之上,弹五弦之琴。作为清角韵,意中迷烦。歌以言志,晨上散关山。有何三老公,卒来在我旁。负揜被裘,似非恒人。 谓卿云何困苦以自怨,徨徨所欲,来到此间?歌以言志,有何三老公。我居昆仑山,所谓者真人。道深有可得。名山历观,遨游八极,枕石漱流饮泉。沈吟不决,遂上升天。歌以言志,我居昆仑山。去去不可追,长恨相牵攀。夜夜安得寐,惆怅以自怜。正而不谲,辞赋依因。经传所过,西来所传。歌以言志,去去不可追。”“愿登泰华山,神人共远游。经历昆仑山,到蓬莱。飘遥八极,与神人俱。思得神药,万岁为期。歌以言志,愿登泰华山。天地何长久!人道居之短。世言伯阳,殊不知老;赤松王乔,亦云得道。得之未闻,庶以寿考。歌以言志,天地何长久!明明日月光,何所不光昭!二仪合圣化,贵者独人不?万国率土,莫非王臣。仁义为名,礼乐为荣。歌以言志,明明日月光。四时更逝去,昼夜以成岁。大人先天而天弗违。不戚年往,忧世不治。存亡有命,虑之为蚩。歌以言志,四时更逝去。戚戚欲何念!欢笑意所之。壮盛智愚,殊不再来。爱时进趣,将以惠谁?泛泛放逸,亦同何为!歌以言志,戚戚欲何念!”在这两首诗里,再也没有“老骥伏枥、志在千里”的豪情壮志,更多是郁闷、矛盾、忧愁和试图摆脱尘世的愿望。
据《三国志·张鲁传》注引《魏名臣奏》载《董昭表》及《杨暨表》称,曹操之所以决定发兵汉中,主要还是听信了凉州从事以及武都归降之人称,张鲁容易被消灭,阳平城下南北两山相距很远,难以固守,遂信以为真,这里所说的凉州从事等,大抵就是指杨阜等人。等到曹操来到阳平关后,才发现远非他们说的那样,遂叹息道:“别人的建议很少能符合我心意的。”听说曹操将要来进攻,张鲁本打算归降,但他的弟弟张卫却不从,率领数万人马固守阳平关,沿着山脉修筑了长达十余里的城墙。曹操下令向阳平关山上张鲁军队的营垒发起进攻,但因山势陡峭,不仅不能顺利攻下,而且三天下来,曹军士兵伤亡很大,并且,曹军携带的军粮也快要吃完了,曹操心灰意冷,说道:“我领兵打仗了三十余年,今天一朝落到了别人之手,这该如何是好?”遂打算命令各军从山上撤回,遂派遣大将军夏侯惇、将军许褚前往山上,呼唤各军下山。据《世语》记载,就在这时,张鲁派遣五官掾前来投降,并逃往巴中,西曹掾郭谌反对说:“不可,张鲁已经投降了,他的来使尚未复命,张卫虽然与他哥哥的意见不同,但可以带上这名使者一起向其发起进攻。我悬军深入,只能前进,不能后退,一旦后退,肯定会惨败。”曹操听了,陷入了前所未有的犹豫之中。当夜,有数千野麋鹿误打误撞闯入了张卫的军营,军中发生恐怖的夜惊,军士们四散而逃,而在山上的曹军高祚等部恰恰又与惊慌失措的张卫军队遭遇,高祚等人吹起鼓角集合部队。张卫吓得心惊胆战,以为曹军大军已经突破了营垒,只好投降了。
曹军这场稀里糊涂的胜利,在当时没有一个人相信。此时,曹操对身边的人说:“这是个妖妄之国,又能兴什么风,起多大的浪?我军已经断粮,我是要赶紧离开此地了!”遂率军掉头就走,留下侍中辛毗、刘晔等人断后,二人判断前方已经取胜了,遂对夏侯惇和许褚说:“我军已经夺占了敌人的要塞,敌人已经败退了!”可是二人根本不相信。夏侯惇亲自前去察看,才发现果真如此。与此同时,刘晔认为军粮已经吃完,即使撤退,也难保能安全回到关中,于是派人飞马报告曹操:“不如向敌人发起猛攻。”这时,夏侯惇也向曹操禀报了前方的情况,曹操这才下令出动强弩手向张卫大营猛烈射击,并趁机大败张卫。
但关于此战还有另外一种说法,是《三国志·武帝纪》的说法:当初曹操的确萌生了退意,但张卫之军见曹军退去后,就懈怠下来,曹操见状,遂秘密派遣解标、高祚等人率众夜袭,遂大破敌人,斩杀了张卫部将杨任,张卫等人趁夜逃走。结合各种资料,我们更愿意相信这次胜利是一场稀里糊涂的胜利。
张鲁听说阳平关已经失陷,就要出城投降,功曹阎圃劝阻道:“如今在被逼无奈之下前去投降,功劳很轻,不如前去依附賨人部落头领杜濩,转而投奔板楯部落酋长朴胡,与曹军对峙一段时间后,再去投降,功劳才大一些。”于是,张鲁率众弃城南逃,进入南山(即大巴山脉),转而进入巴中地区(今四川省巴中市)。在张鲁离去之前,身边的人们都建议他下令焚烧仓库,张鲁却说:“原本就想要归降朝廷,只是我的意愿没能实现,今天逃走,只是为了躲避兵锋,并无恶意,仓库内的财宝都是属于国家的。”遂封好仓库而去。曹操进入汉中后,对张鲁的举动非常赞赏,又因为张鲁本有投降之意,就派人前去安抚。
丞相主簿司马懿建议曹操道:“刘备凭借奸诈的手段劫持了刘璋,蜀地百姓对他并不服气,如今,他又率军远出益州,去与孙权争夺荆州,机不可失!如今,我军攻克了汉中,益州震动,如果以大兵前去,势必土崩瓦解。圣人行事不能违背天时,也不可以失去机会。”曹操说了一句很著名的话:“人最痛苦的就是贪得无厌,既然得到了陇上,还想要蜀地!(得陇望蜀的来源)”刘晔也劝曹操:“大人以五千步兵起事,就要诛灭董卓,北破袁绍,南征刘表,九州之地,大人兼并了十分之八,威震天下。如今已经得到了汉中,蜀人已吓破了胆,根本无心坚守,蜀地可以传檄而定。刘备是人中豪杰,虽有谋略,但反应迟钝,他得到蜀地时间很短(仅仅一年),蜀地百姓不会为他效命,如今,汉中已破,蜀人震恐,势必自行崩溃。以大人的威武神明,趁机施加压力,将战无不胜。如果稍稍拖延,诸葛亮身为宰相,精通治国,关羽、张飞作为将帅,勇冠三军,蜀地百姓一旦安定下来,固守险要,将难以攻克了。今日不取,必定会留下后患!”此时的曹操早已对不停的征战十分厌倦了,他没有听从。
当时,刘备从荆州回军后,并没有马不停蹄地北上,一方面可能是时间来不及,另一方面可能就是对前途没有把握,不敢深入,可见当时益州的局势是非常险恶的。曹操在汉中停留七天后,益州前来投降的人向曹操报告说:“益州一天之内军民发生数十起惊扰,刘备亲自下令斩杀弹压,也制止不住。”曹操又把刘晔接来,问道:“现在还能打吗?”刘晔回答:“如今已稍稍安定下来了,不能打了。”于是,曹操以夏侯渊为都护将军,都督张郃、徐晃等将驻守汉中,以丞相长史杜袭为驸马都尉,留督汉中事务,他自己则率领大军撤离了汉中。曹操升任刘晔为行军长史,兼任领军将军。在杜袭的劝说下,汉中百姓自愿迁往邺城、洛阳的有八万多人。
到了九月,在曹军的压力下,巴郡賨部落酋长朴胡、杜濩、任约各自率领部众投降,曹操将巴郡分为巴东(今重庆市奉节县)、巴西(今四川省阆中市)、巴郡(今重庆市),虽然如此,但所置的三巴治所不详,应当还在川东北一带,以朴胡为巴东太守、杜濩为巴西太守、任约为巴郡太守。刘备派人将要说服张鲁归降,张鲁对刘备非常看不起,他说道:“我宁可当曹公的奴仆,也不会当刘备的座上客!”十一月,张鲁也率领家眷投降,曹操派人将其拜为镇南将军,封阆中侯,食邑一万户,以宾客之礼对待张鲁;又把张鲁的五个儿子以及阎圃等人都封为列侯,并替自己的儿子曹彭祖娶了张鲁的女儿为妻。原关中诸将程银、侯选、庞德也都随着张鲁投降了曹操,曹操恢复了程银、侯选原来的官爵,又拜庞德为立义将军。曹操还恢复汉宁郡为汉中郡,将汉中郡的安阳县、西城县分出,成了西城郡,治所设在今陕西省安康市;并分置上庸郡,治所设在今湖北省竹山县。