Почему bat выводит в wmic неправильный месяц?
Потому что присвоилось значение из последней отфильтрованной findstrом записи: WeekInMonth=2
Вы можете в вызове wmic отфильтровать столбцы, которые он будет возвращать:
wmic path win32_utctime get Month /format:list

На счет часов - тут все просто вы вызываете win32_utctime - она возвращает время в UTC, как это ни странно. Очевидно, в винде выставлен московский часовой пояс - +3 к UTC.
Используйте win32_localtime вместо win32_utctime.
win32_utctime 
посмотри сколько сейчас времени по UTC и у вас (насколько я понимаю вы живете по московскому времени
алсо, для дебага - выведите себе результат 
wmic path win32_utctime get /format:list и внимательно просмотрите.
Сейчас вторая неделя месяца и именно эта строка встречается последней (а не сам month) - поэтому ваши фильтры выцепляют именно ее.

А вообще закопайте уже стюардессу и пишите на powershell, если вы, конечно, не занимаетесь арехологией. Пометка: используйте Windows Powershell а не последний доступный Posh 7. Работа с wmi есть только в windows powershell, из более новых версий она выпилена в угоду кросплатформенности