Eu não tenho sqlcmd, então não posso comentar como isso está interpretando os parâmetros que estão sendo passados, mas se eu usar a estrutura que você está usando para entregar os parâmetros para um arquivo em lotes que apenas ecoa o comando que invocou o shell cmd ( echo %cmdcmdline%
) mostra que o que está sendo passado como parâmetros é o seguinte:
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"
O analisador do Sqlcmd provavelmente não faz o mesmo que o Powershell está removendo aspas em torno de alguns dos parâmetros como o local da consulta e a maneira como o parâmetro DB="ksuite" é seriamente alterado.
Uma opção que pode funcionar é apenas agrupar o lote inteiro entre aspas simples para preservar as cadeias duplas internas e esperar que o analisador sqlcmd possa lidar com isso:
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"'
Isso entregará a lista de parâmetros não modificados para o sqlcmd, mas o fará como um único parâmetro no que diz respeito ao shell e eu ficaria surpreso se funcionasse. É muito mais provável que você tenha sucesso se você citar seletivamente todos os blocos de parâmetros que estão sendo modificados com aspas simples da seguinte forma:
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"'
Se isso ainda não funcionar, pode haver outros itens que precisam ser explicitamente ignorados e não apenas evitados alternando entre aspas simples e dupla usando o caractere de backtick que é usado como caractere de escape na análise de cadeias de caracteres do Powershell.
Você pode obter mais informações sobre todos os aspectos de cotação e escape via help about_quoting
no PowerShell.