У моего друга была следующая идея, которую я сейчас использую. Я тестировал его только на Windows XP и OS X, где он работает нормально. По общему признанию, это не очень удобно при тестировании, но в принципе оно должно работать нормально почти везде.
\newif\ifwindows
\immediate\write18{echo $SHELL > \jobname.os}
\newread\@whichos
\immediate\openin\@whichos\jobname.os
\read\@whichos to \@whichosshell
\ifthenelse{\equal{\@whichosshell}{$SHELL }}
{\windowstrue}
{\windowsfalse}
\closein\@whichos
\ifwindows
\typeout{System detected: Windows}
\newcommand\DeleteFile[1]{\immediate\write18{del #1}}
\else
\typeout{System detected: Unix-like}
\newcommand\DeleteFile[1]{\immediate\write18{rm #1}}
\fi
% Cleanup.
\DeleteFile{\jobname.os}
Ключевым моментом здесь является то, что Windows не будет расширять переменную среды $SHELL
(на самом деле, любая другая переменная сделала бы это), поэтому она будет записывать строку $SHELL
в файл буквально.