Using Sql 2k5 or higher, instead of osql, use sqlcmd. Don't be scared, it uses same arguments but offers more. But basically I totally agree with you. One should always choose the tool right for the job.
Also, what I really like is that I know can easily save detailed query results per executed sql-file. And adding the '-b' option, quit when there's an error.
My 'runallsql.cmd' looks like this:
for %%f in (*.sql) do (
sqlcmd -S %SERVER% -E -b -Q %%f -o %%~nf.log
if errorlevel 1 goto error
echo ERROR EXECUTING!
n.b. I've tried to cover above functionality in powershell (without using sqlcmd), but saving the output prooved to be tricky.