Это классический случай двойного экранирования, когда bash и CMD.EXE должны быть проинструктированы игнорировать специальный | (труба) символ.
Попробуйте следующее:
$command $args "qt.sln" /BUILD '"Debug|Win32"'
Это будет эквивалентно тому, как вы печатаете в командной строке CMD.EXE:
qtvars.bat vsstart qt.sln /BUILD "Debug|Win32"
Используя вышеизложенное, вы по сути заставляете передачу двойных кавычек в CMD.EXE (вместо того, чтобы их уничтожать bash). Внешние одинарные кавычки инструктируют bash не интерпретировать и не касаться того, что внутри них; внутренние двойные кавычки инструктируют CMD.EXE игнорировать любые специальные символы (в данном случае это труба).
Кроме того, вы также можете попробовать:
$command $args "qt.sln" /BUILD 'Debug\|Win32'
Это должно быть эквивалентно тому, как вы печатаете в командной строке CMD.EXE:
qtvars.bat vsstart qt.sln /BUILD Debug\|Win32
Обратите внимание на использование одинарных кавычек (!), Которые гарантируют, что bash не будет интерпретировать \ (и вместо этого передаст его как есть в CMD.EXE.)