Я не уверен на 100% в этом, но вот мои мысли:
Вы делаете cmd.WaitForExit (), хотя также включен RedirectStandardOutput, что означает, что любой вывод в CMD будетзаписано в поток StandardOutput.
Поскольку вы ожидаете завершения процесса, прежде чем когда-либо читаете StandardOuput, я предполагаю, что поток заполняется, и в конечном итоге процесс останавливается, пока поток не освободится снова.
Таким образом, вам, вероятно, придется просто переключить две последние строки, сначала выполнить StandardOutput.ReadToEnd, а затем WaitForExit.
В противном случае, для уточнения комментария от BugFinder, используйте функциональность из System.IO в копирование файлов .