I don't have sqlcmd so I can't comment on how that is interpreting the parameters it is being passed but if I use the structure you are using to delivers the parameters to a batch file that just echoes the command that invoked the cmd shell (
echo %cmdcmdline%) shows that what is being passed as the parameters is as follows:
cmd /c ""C:\Users\Joe\sqlcmd.cmd" -S .\SQLEXPRESS -i f:\SQLBackups\ExpressMaint.sql -v DB=ksuite -v OPTYPE=DB -v BACKUPFOLDER=f:\SQLBackups -v REPORTFOLDER=f:\SQLBackups\Reports -v DBRETAINUNIT=days -v DBRETAINVAL=7"
Sqlcmd's parser probably does not ike the way that Powershell is stripping outthe quotes around some of the parameters like the query location and the way the DB="ksuite" parameter is seriously changed.
One option that might work is to just wrap the whole lot in single quotes to preserve the internal double quoted strings and hope that the sqlcmd parser can deal with this:
sqlcmd '-S .\SQLEXPRESS -i "f:\SQLBackups\ExpressMaint.sql" -v DB="ksuite" -v OPTYPE="DB" -v BACKUPFOLDER="f:\SQLBackups" -v REPORTFOLDER="f:\SQLBackups\Reports" -v DBRETAINUNIT="days" -v DBRETAINVAL="7"'
That will deliver the unmodified parameter list to sqlcmd but it does so as a single parameter as far as the shell is concerned and I would be surprised if it worked. You are much more likely to have success if you selectively quote all parameter blocks that are being modified with single quotes as follows:
sqlcmd.cmd -S .\SQLEXPRESS -i '"f:\SQLBackups\ExpressMaint.sql"' -v 'DB="ksuite"' -v 'OPTYPE="DB"' -v 'BACKUPFOLDER="f:\SQLBackups"' -v 'REPORTFOLDER="f:\SQLBackups\Reports"' -v 'DBRETAINUNIT="days"' -v 'DBRETAINVAL="7"'
If this still doesn't work there may be other items that need to be explicitly escaped and not just avoided by switching between single and double quoting by using the backtick character which is used as the escape character in Powershell string parsing.
You can get more info on all aspects of quoting and escaping via
help about_quoting from within PowerShell.