Como mencionei na resposta do lyceus, seu código falhará no código de idioma do Windows que não é o inglês, pois a saída de mode
pode não conter as subseqüências "colunas" ou "linhas":
Você pode encontrar a substring correta sem procurar texto:
preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
Observe que eu nem estou me incomodando com as linhas porque não é confiável (e eu realmente não me importo com elas).
Edit: De acordo com comentários sobre o Windows 8 (oh você ...), acho que isso pode ser mais confiável:
preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
Mas teste, porque eu não testei.