Согласно Википедии:
.bat: первое расширение используется Microsoft для пакетных файлов. Это расширение может быть выполнено в большей части Microsoft Operating Systems, включая MS-DOS и большинстве версий Microsoft Windows.
.cmd: более новое .cmd расширение описано основанными на Windows NT системами как 'Командный сценарий Windows NT' и полезно, поскольку использование .cmd расширения, а не .bat расширения означает, что более ранние версии Windows не будут знать, как выполнить его, так, чтобы они не пытались и принимали команды за файлы стиля COMMAND.COM и сбой для выполнения модернизированных команд из-за отсутствия расширений команды, приводящих к сценариям, только частично выполняемым, который мог доказать повреждение (например; отказ проверить успешное копирование файла и затем удаление оригинала так или иначе).
Единственное известное различие между .cmd и .bat обработкой файла - то, что в .cmd файле переменная ERRORLEVEL изменяется даже на успешной команде, которая затронута Расширениями Команды (когда Расширения Команды включены), тогда как в .bat файлах переменная ERRORLEVEL изменяется только на ошибки.
Надеюсь, это поможет.
"1$" соответствует первой паре скобок на той же строке (RewriteRule); Вам нужно "%1", который соответствует первой паре скобок на/previous/строке - RewriteCond:
RewriteCond %{QUERY_STRING} ^uid=([0-9]+)$
RewriteRule ^profile\.php$ http://www.newsite.com/utenti/%1 [R=301,L]
Лучший путь состоял бы в том, чтобы сделать это только с 1 строкой (RewriteRule), но Вы не можете сделать этого, если uid находится в QueryString.