RE:NODE

SteamCMD на Windows: установка, скрипты и обновления

Автор Команда RE:NODE
18 мин чтения


SteamCMD на Windows - это один zip-файл: скачайте steamcmd.zip у Valve, распакуйте его в короткий путь вроде C:\steamcmd и один раз запустите steamcmd.exe с параметром +quit, чтобы он обновил сам себя. После этого каждая установка сервера выглядит одинаково: +force_install_dir с абсолютным путём, +login anonymous, +app_update <id> validate, +quit. Эту строку переносят в файл скрипта, вызывают из batch-файла, а затем отдают Планировщику заданий для обновлений без вашего участия. Сложности возникают именно в специфике Windows: пути с пробелами, папки внутри Program Files или профиля пользователя, запланированная задача, которая работает от другого пользователя, чем тот, под которым вы тестировали, и Defender, сканирующий тысячи мелких файлов при каждом обновлении. Этим частям и посвящена статья. Сами аргументы, таблица ошибок и устройство app id описаны в материале SteamCMD: подробный разбор, а переключение веток - в материале App ID SteamCMD и бета-ветки.

Загрузка SteamCMD и первый запуск#

Установщика нет, и в меню «Пуск» ничего добавлять не нужно. Valve публикует zip с единственным небольшим исполняемым файлом, а всё остальное этот файл скачивает сам.

  1. Создайте для него папку. Принято использовать C:\steamcmd, и короткий путь потом пригодится.
  2. Скачайте https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip и распакуйте steamcmd.exe в эту папку.
  3. Откройте командную строку или PowerShell, перейдите в папку и выполните steamcmd.exe +quit.

Те же три шага в обычном (без повышения прав) окне PowerShell:

code
PS> New-Item -ItemType Directory -Path C:\steamcmdPS> Invoke-WebRequest -Uri https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip `      -OutFile C:\steamcmd\steamcmd.zipPS> Expand-Archive C:\steamcmd\steamcmd.zip -DestinationPath C:\steamcmdPS> C:\steamcmd\steamcmd.exe +quit

Первый запуск - это самообновление. SteamCMD сообщает, что проверяет обновления, скачивает свои пакеты, распаковывает их и перезапускается, после чего доходит до Loading Steam API...OK и приглашения командной строки. При нормальном соединении это занимает минуту-две. Точные строки меняются от релиза к релизу, но выглядят примерно так:

code
[  0%] Checking for available updates...[----] Downloading update (...)[----] Extracting package...[----] Installing update...[----] Cleaning up...[----] Update complete, launching Steamcmd...Loading Steam API...OK

Дождитесь завершения. Если прервать первый запуск - закрыть окно или получить тайм-аут запланированной задачи, - останется наполовину распакованный клиент, который при следующем запуске будет падать непонятным образом. В этом случае удалите всё в папке, кроме steamcmd.exe, и снова выполните +quit. Это же стандартное лечение для SteamCMD, который после месяцев нормальной работы начал вылетать при старте: загрузчик заново соберёт всё, что ему нужно, а в этих файлах нет ничего ценного, если только вы не устанавливали серверы в папку по умолчанию (см. следующий раздел).

SteamCMD проверяет собственные обновления при каждом запуске, а не только при первом. Если Valve выпустила новый клиент, ваше следующее обновление по скрипту потратит первую минуту на обновление самого SteamCMD и только потом возьмётся за игру. Учитывайте это при выборе тайм-аутов.

Среды выполнения, которые понадобятся серверу

Самому SteamCMD дополнительно ничего не нужно. Серверам, которые вы с его помощью скачиваете, часто нужно. Многие серверы для Windows собраны с расчётом на Microsoft Visual C++ Redistributable, и если его нет, сервер отказывается запускаться и выдаёт сообщение о DLL, например VCRUNTIME140.dll или MSVCP140.dll. Некоторым старым серверам и серверам на Unreal нужны ещё и компоненты среды DirectX. Это требования конкретных игр, а не SteamCMD, поэтому смотрите документацию сервера нужной игры. Установить актуальный x64 Visual C++ Redistributable от Microsoft до первого сервера - разумный выбор по умолчанию на свежей машине с Windows Server: в ней нет большей части того, что настольный Windows за годы набирает от игр.

Где что лежит: структура папок#

После первого запуска в C:\steamcmd появляется несколько десятков файлов и папок. Стоит знать вот эти:

ПутьЧто в нём
steamcmd.exeЗагрузчик. Единственный файл, который нужно сохранять
package\Пакеты клиента после самообновления
config\config.vdfНастройки и сохранённый вход для реальных аккаунтов
logs\Текстовые логи, включая content_log.txt для загрузок
steamapps\Папка установки по умолчанию и собственное состояние SteamCMD

Два пункта требуют пояснения. В config\config.vdf SteamCMD хранит сохранённые учётные данные после того, как вход с реальным аккаунтом прошёл Steam Guard. Для анонимных установок это неважно, а для Arma 3 или DayZ именно этот файл делает возможными обновления без участия человека, и обращаться с ним нужно как с паролем. В logs\content_log.txt с отметками времени записаны все загрузки, все смены состояния и все сбои. Когда обновление ночью не удалось, а собственный лог batch-файла ничего полезного не говорит, читать нужно именно его.

Если вы не задали +force_install_dir, серверы окажутся в C:\steamcmd\steamapps\common\<AppName>. Для одного сервера это работает, а для нескольких становится неудобным: файлы игры лежат внутри папки инструмента, при восстановлении SteamCMD их приходится обходить, а резервная копия «сервера» случайно захватывает и клиент. Удобная в обслуживании схема разделяет SteamCMD, серверы и скрипты:

code
C:\steamcmd\                 SteamCMD onlyC:\servers\valheim\          one folder per server installC:\servers\satisfactory\C:\servers\scripts\          .txt runscripts, .cmd files, logs

Делайте корневой путь коротким и без пробелов. У многих программ в Windows до сих пор действует ограничение пути в 260 символов, если длинные пути не включены в политике и сама программа не поддерживает их, а игровые серверы к таким программам надёжно не относятся. Элемент Workshop, лежащий на несколько уровней вглубь в C:\Users\Administrator\Documents\Game Servers\..., подбирается к этому пределу на удивление близко.

Особенно избегайте трёх мест:

  • `C:\Program Files` и `C:\Program Files (x86)`. Для записи туда нужны повышенные права, поэтому либо каждое обновление приходится запускать от администратора, либо оно завершается ошибкой доступа на полпути.
  • Профиль пользователя, включая рабочий стол, «Документы» и «Загрузки». Задача, запущенная от другой учётной записи, их не видит, а контролируемый доступ к папкам в Defender, если он включён, не даёт незнакомым программам писать в эти папки.
  • Папка, синхронизируемая OneDrive. Клиенты синхронизации блокируют и выгружают файлы в тот момент, когда SteamCMD их заменяет, а игровой сервер, который записывает мир каждые несколько минут, превращается в постоянный поток синхронизации.

У каждой установки сервера есть собственный файл steamapps\appmanifest_<appid>.acf с номером установленной сборки. По нему можно узнать, на какой версии находится сервер; как это делается, описано в материале SteamCMD: подробный разбор.

force_install_dir на Windows#

+force_install_dir принимает абсолютный путь, а на Windows сложности связаны с путями и кавычками.

code
C:\steamcmd\steamcmd.exe +force_install_dir C:\servers\valheim +login anonymous ^    +app_update 896660 validate +quit

Символ ^ - это перенос строки в командной строке и batch-файлах. В PowerShell для переноса используется обратный апостроф, а в любой из оболочек безопаснее держать всю команду в одной строке, пока она не заработает.

Порядок важен. Свежие сборки SteamCMD выводят предупреждение вроде «Please use force_install_dir before logon!», если +login стоит первым, и в зависимости от версии каталог при этом игнорируется, а файлы попадают в место по умолчанию. Ставьте +force_install_dir первым, затем +login, затем +app_update. Тот же порядок действует и внутри файлов скриптов.

Если в пути есть пробел, возьмите его в кавычки: +force_install_dir "C:\Game Servers\valheim". Кавычки работают, но это ещё одно место, где легко ошибиться в batch-файлах: переменная с путём в кавычках при использовании получает второй комплект кавычек. Проще всего использовать путь без пробелов.

Не используйте относительные пути. Относительный каталог отсчитывается от папки самого SteamCMD, а не от папки вашего batch-файла или оболочки, поэтому +force_install_dir ..\valheim указывает в разные места в зависимости от того, где лежит SteamCMD. Подключённый сетевой диск - тоже плохая цель: буквы дисков относятся к конкретному сеансу входа, поэтому диск, подключённый в вашем рабочем сеансе, для запланированной задачи не существует, а SteamCMD по SMB работает медленно и ненадёжно, даже когда диск доступен.

Одна папка SteamCMD может обслуживать любое число установок серверов, потому что у каждой свой force_install_dir. Нельзя лишь запускать его дважды одновременно. Два экземпляра делят package\, config\ и самообновление, а второй запуск во время самообновления первого - верный способ повредить клиент. Если по расписанию обновляется несколько серверов, обновляйте их друг за другом в одном скрипте или разнесите задачи по времени так, чтобы каждая успевала завершиться.

Файлы скриптов и +runscript#

Длинная командная строка в batch-файле становится проблемой сопровождения, как только нужно поменять один аргумент в шести местах. Вместо этого SteamCMD может читать команды из текстового файла, по одной в строке, без префикса +:

C:\servers\scripts\update-valheim.txt
// Valheim dedicated server, app 896660@ShutdownOnFailedCommand 1@NoPromptForPassword 1force_install_dir C:\servers\valheimlogin anonymousapp_update 896660quit
code
C:\steamcmd\steamcmd.exe +runscript C:\servers\scripts\update-valheim.txt

Строки, начинающиеся с //, - комментарии. Две строки с @ - это настройки: @ShutdownOnFailedCommand 1 останавливает выполнение на первой же неудавшейся команде, а не продолжает до quit, а @NoPromptForPassword 1 не даёт запуску без присмотра зависнуть навсегда на запросе пароля, на который некому отвечать. Обе должны быть в каждом скрипте, который работает без вашего наблюдения. Путь к скрипту передавайте абсолютным - по той же причине, что и для force_install_dir.

Обратите внимание на то, чего в этом скрипте нет: validate. Обычное обновление скачивает только изменившиеся фрагменты, а validate читает и хеширует всю установку и заменяет любой изменённый вами поставляемый файл. Держите второй скрипт с validate для починки и запускайте его вручную, когда он нужен. Обоснование приведено в материале безопасная автоматизация обновлений игровых серверов.

В файл скрипта можно поместить и несколько приложений. После одного login может идти несколько пар force_install_dir и app_update: обновления выполняются по очереди в одном запуске SteamCMD, и проблема двух экземпляров, о которой говорилось выше, исчезает:

C:\servers\scripts\update-all.txt
@ShutdownOnFailedCommand 1@NoPromptForPassword 1login anonymousforce_install_dir C:\servers\valheimapp_update 896660force_install_dir C:\servers\satisfactoryapp_update 1690800quit

Здесь login стоит перед каталогом, на что жалуется предупреждение выше. На практике последующие строки force_install_dir учитываются для идущего за ними app_update, но поведение менялось между версиями SteamCMD, поэтому после первого запуска проверьте, куда попали файлы. Если предупреждение для вас важно, используйте отдельный скрипт для каждого сервера.

Batch-файл, который останавливает, обновляет и проверяет#

SteamCMD не может заменить файлы, которые держит открытыми работающий сервер. Обновление запущенного сервера либо завершается ошибкой «файл используется», либо, что хуже, проходит наполовину и оставляет установку, которая падает при следующем старте. Поэтому задача обёртки такова: корректно остановить сервер, обновить, проверить результат, запустить сервер.

В примере предполагается, что сервер работает как служба Windows с именем Valheim (обычно для этого используют NSSM - в руководстве по Valheim на Windows настраивается такая служба с правильной остановкой по Ctrl+C, чтобы мир успевал сохраниться). net stop дожидается остановки службы и только потом возвращает управление, что нам и нужно.

C:\servers\scripts\update-valheim.cmd
@echo offsetlocalcd /d "%~dp0"set LOG=%~dp0update-valheim.logecho ==== %DATE% %TIME% ==== >> "%LOG%"net stop Valheim >> "%LOG%" 2>&1C:\steamcmd\steamcmd.exe +runscript "%~dp0update-valheim.txt" > "%~dp0last-run.log" 2>&1type "%~dp0last-run.log" >> "%LOG%"findstr /C:"Success! App '896660'" "%~dp0last-run.log" >nulif errorlevel 1 (    echo UPDATE FAILED - server left stopped >> "%LOG%"    exit /b 1)net start Valheim >> "%LOG%" 2>&1exit /b 0

Несколько строк требуют пояснения.

  • cd /d "%~dp0" переходит в папку, где лежит batch-файл. %~dp0 раскрывается в эту папку с завершающим обратным слешем. Планировщик заданий запускает задачи в C:\Windows\System32, если не указано иное, и любой относительный путь в скрипте, который «работал при двойном щелчке», там ломается.
  • Проверка успеха читает вывод SteamCMD, а не код возврата. Код возврата в разных версиях не был надёжным сигналом, и неудачная загрузка может завершиться кодом, который выглядит нормальным. После удачного обновления или установки SteamCMD выводит строку Success! App '<id>' fully installed., а если версия уже актуальна - Success! App '<id>' already up to date. Сопоставление по общему началу принимает обе.
  • При сбое скрипт оставляет сервер остановленным. Это осознанный выбор. Запуск сервера на наполовину обновлённой установке грозит повреждением мира, а остановленный сервер заметят игроки, и кто-нибудь займётся проблемой. Если для сервера простой хуже риска, измените эту ветку так, чтобы служба всё равно запускалась, а оповещение о сбое приходило другим способом.
  • %DATE% и %TIME% форматируются по региональным настройкам системы, поэтому не стройте из них имена файлов: формат на разных машинах отличается. Если нужен отдельный лог на каждый запуск, получайте метку времени из PowerShell с помощью Get-Date -Format yyyyMMdd-HHmm.

Если сервер - не служба, а консольное окно, запущенное из batch-файла, то корректно остановить его из скрипта нельзя. Закрытие окна или taskkill /F завершает процесс, не дав ему сохраниться. Если вы собираетесь обновлять серверы без присмотра, запускайте их как службы: это единственная схема, в которой «остановить» означает именно корректную остановку.

Обновления по расписанию через Планировщик заданий#

Планировщик заданий - это cron для Windows. Им можно управлять через графический интерфейс (taskschd.msc) или из командной строки с помощью schtasks, которую проще описать и повторить.

code
schtasks /Create /TN "Servers\Update Valheim" ^    /TR "C:\servers\scripts\update-valheim.cmd" ^    /SC WEEKLY /D MON /ST 05:00 /RU SYSTEM /RL HIGHEST

Эта команда создаёт задачу в папке Servers, которая выполняется каждый понедельник в 05:00 от встроенной учётной записи SYSTEM с наивысшими привилегиями. Сразу проверьте её и прочитайте последний результат:

code
schtasks /Run /TN "Servers\Update Valheim"schtasks /Query /TN "Servers\Update Valheim" /V /FO LIST

Last Result: 0 означает, что batch-файл завершился с кодом 0, а в приведённом выше скрипте это значит, что строка об успехе была найдена. 1 означает, что сработала собственная ветка сбоя скрипта. Всё остальное - большое шестнадцатеричное число - обычно говорит о том, что задача не дошла до запуска скрипта: неверный путь в /TR или у учётной записи нет доступа к папке.

Решающее значение имеет то, от какой учётной записи работает задача.

Запуск отПодходит дляНа что обратить внимание
SYSTEMАнонимные установки, службыПолный контроль над машиной
Отдельный локальный пользовательВход с реальным аккаунтомНужны права на папки
Ваша учётная записьТестированиеСмена пароля ломает задачу

SYSTEM - самый простой вариант: он может останавливать и запускать службы и писать куда угодно. Это же самая мощная учётная запись на машине, поэтому скрипт, который она запускает, должен лежать в папке, куда могут писать только администраторы. Для серверов, которым нужен настоящий вход в Steam (Arma 3, DayZ), чище подойдёт отдельный локальный пользователь. Войдите под ним один раз, запустите SteamCMD вручную и пройдите Steam Guard, и сохранённые в config\config.vdf учётные данные позволят запланированной задаче в дальнейшем входить без запроса. Этому пользователю нужны права на изменение для C:\steamcmd и C:\servers, право «Вход в качестве пакетного задания» (оно выдаётся автоматически, когда вы сохраняете задачу вместе с паролем) и право управлять службой, если скрипт её останавливает и запускает.

Параметры, которые стоит задать в свойствах задачи, какую бы учётную запись вы ни выбрали:

  • Выполнять вне зависимости от входа пользователя в систему. Иначе задача выполняется только пока кто-то вошёл в консоль.
  • Останавливать задачу, выполняемую дольше разумного времени, например двух часов. По умолчанию стоят три дня, а это надолго скрывает зависший SteamCMD.
  • Не запускать новый экземпляр, если задача уже выполняется. Это значение по умолчанию, и оно не даёт двум запускам SteamCMD пересечься.
  • Запускать задачу как можно скорее после пропуска запланированного запуска. Полезно, если в 05:00 машина перезагружалась из-за обновлений Windows, хотя совпадения еженедельного обновления сервера с Patch Tuesday лучше избегать с самого начала.

Как часто запускать обновление, зависит от сервера. Ванильный сервер можно обновлять раз в неделю или при каждом перезапуске, а сервер с модами в день игрового патча вообще не должен обновляться сам, потому что обновление ломает моды, пока их авторы не подтянутся. О восстановлении рассказывает материал что делать, когда обновление мода всё сломало, а о том, что ещё стоит поставить в то же расписание, - материал полезные задачи по расписанию.

stop firstupdate.txtoutputstart only on successTask Schedulerраз в неделю, 05:00update-valheim.cmdстоп, обновление, проверкаsteamcmd.exe+runscriptlast-run.logSuccess! AppСлужба Valheimnet stop / net start
Обновление по расписанию на Windows

Исключения Windows Defender#

Защита Microsoft Defender в реальном времени сканирует файлы по мере записи. Обновление записывает их тысячами, а validate читает каждый файл установки, и Defender может просканировать их повторно. На большой установке это разница между validate, который завершается за несколько минут, и таким, который идёт заметно дольше. Кроме того, Defender может на мгновение удерживать только что записанный файл открытым на время сканирования, и это изредка сталкивается с тем, как SteamCMD перемещает его на место.

Исключение папки SteamCMD и папок серверов из сканирования устраняет обе проблемы. Из окна PowerShell с повышенными правами:

code
PS> Add-MpPreference -ExclusionPath "C:\steamcmd"PS> Add-MpPreference -ExclusionPath "C:\servers"PS> Get-MpPreference | Select-Object -ExpandProperty ExclusionPath

Последняя строка выводит текущие исключения, чтобы вы могли убедиться, что они применились. На машине, которой управляют через групповую политику или Intune, локальные исключения могут игнорироваться или перезаписываться, и тогда исключения должна задавать сама политика.

Трезво оцените цену такого решения. Исключение означает, что Defender не станет смотреть ни на что в этих папках, в том числе на вредоносный плагин, который вам прислали, или мод, скачанный с сайта, которому не стоило доверять. Ограничивайте исключения только нужными папками, никогда не исключайте папку загрузок или целый диск и проверяйте моды и плагины, прежде чем класть их в исключённую папку. Почему это не паранойя, объясняет материал вредоносные плагины и моды.

Исключения Defender не связаны с брандмауэром Windows Defender. Самому SteamCMD нужен только исходящий доступ в интернет, который Windows разрешает по умолчанию. Игровому серверу нужны входящие правила для его портов, и при первом запуске Windows спросит, разрешить ли ему работу в частных или общедоступных сетях. Отвечайте для той сети, в которой сервер действительно находится, или создайте правила сами с помощью New-NetFirewallRule - оба способа разобраны в упомянутом выше руководстве по Valheim на Windows.

Устранение неполадок SteamCMD на Windows#

SteamCMD закрывается сразу после двойного щелчка, или окно мелькает и пропадает. Вероятно, он обновился и перезапустился или наткнулся на ошибку и завершился. Запустите его из открытой командной строки, чтобы вывод оставался на экране, и прочитайте logs\bootstrap_log.txt.

`Failed to install app 'X' (Disk write failure)`. Целевая папка недоступна для записи учётной записи, от которой работает SteamCMD, или диск заполнен. Если ошибка возникает только из Планировщика заданий, сначала проверьте учётную запись. Если диск заполнен, помните, что для обновления нужно свободное место сверх уже установленного - сколько именно, рассказывает материал что делать, когда диск заполнен.

`Failed to install app 'X' (Missing file permissions)` или отказ в доступе. Файл установки используется (сервер всё ещё работает), доступен только для чтения или принадлежит учётной записи, которая не может его изменять. Остановите сервер, затем сравните права на папку с учётной записью, от которой работает задача.

Обновление сообщает об успехе, но сервер не изменился. Задача запустила другой скрипт, каталог установки в скрипте отличается от того, из которого запускается служба, или force_install_dir оказался после login, и файлы попали в C:\steamcmd\steamapps\common. Поищите там вторую копию сервера.

У задачи ненулевой Last Result, но лог пуст. Batch-файл не запустился или запустился в System32 и записал свой лог туда. Проверьте путь в действии задачи и строку cd /d "%~dp0".

SteamCMD зависает на входе в запланированной задаче. Он ждёт пароль или код Steam Guard, который никогда не придёт. Один раз запустите SteamCMD вручную от учётной записи задачи, чтобы сохранить учётные данные, и оставьте в скрипте @NoPromptForPassword 1, чтобы следующий сбой завершал работу, а не приводил к зависанию.

После обновления Windows всё перестало работать. Как правило, дело не в SteamCMD. Убедитесь, что служба по-прежнему запускается вручную и задача по-прежнему существует, затем удалите всё в C:\steamcmd, кроме steamcmd.exe и папки config (если вы используете реальный аккаунт), и выполните +quit, чтобы пересобрать клиент.

Когда запускать Windows совсем не хочется#

Большая часть этой статьи существует потому, что Windows не проектировали для работы с консольными инструментами без присмотра, а каждый шаг выше - обёртки для служб, учётные записи задач, исключения Defender - нужен, чтобы она так себя вела. Некоторые серверы выпускаются только под Windows, и для них это стоит затраченных усилий, а заодно стоит прочитать Linux и Windows для игровых серверов и путь через Wine и Proton. Для остальных вопрос в том, хотите ли вы вообще обслуживать эту машину.

В RE:NODE шаг SteamCMD выполняется при создании игрового сервера, обычно в течение минуты после прохождения платежа, а вывод установки появляется в консоли строка в строку. Игровые переменные и параметры запуска - это поля на вкладке Startup, поэтому поддерживать скрипты не нужно. Вкладка Schedules запускает задачи в стиле cron с упорядоченными шагами - резервная копия, затем перезапуск, с паузами между ними, - и это покрывает то, что выше делает Планировщик заданий; как это настроить, показано в руководствах. Играм, которым нужен ваш собственный вход в Steam, предстоит дождаться на вкладке Setup, пока вы его не добавите.

FAQ#

Нужно ли запускать SteamCMD от администратора?

Нет, если и он, и папки серверов находятся там, куда учётная запись может писать, например C:\steamcmd и C:\servers. Необходимость в правах администратора обычно означает, что файлы лежат в Program Files. Повышенные права в этой схеме нужны только для добавления исключений Defender и создания задач, работающих от SYSTEM.

Можно ли использовать раздел Tools в клиенте Steam вместо SteamCMD?

Для некоторых серверов - да: выделенные серверы, перечисленные в разделе Tools библиотеки Steam, устанавливаются как обычные игры. Для этого на машине нужен полноценный клиент Steam с выполненным входом, и обновляется он тогда, когда решит Steam, что подходит домашнему ПК, на котором ещё и играют. Машине, которая только держит серверы, лучше подойдёт SteamCMD: ему не нужен рабочий сеанс.

Где находятся логи SteamCMD на Windows?

В папке logs внутри каталога SteamCMD, например C:\steamcmd\logs. В content_log.txt записаны загрузки и сбои установки, и это первый файл, который нужно читать при неудачном обновлении. Лог вашего batch-файла - отдельный, и в нём лежит только то, что вы в него перенаправили.

Можно ли скачать Linux-сборку сервера из Windows?

Да. Добавьте @sSteamCmdForcePlatformType linux в начало скрипта перед login. Файлы скачаются, но на Windows не запустятся; это полезно, чтобы подготовить установку для копирования на машину с Linux или в файловый менеджер хостинга.

Как удалить SteamCMD?

Удалите его папку, а также созданные для него запланированные задачи и исключения Defender. SteamCMD ничего не пишет в реестр и не устанавливает собственных служб. Установки серверов в других папках остаются нетронутыми и продолжают работать, теряя только средство обновления.

Почему обновление каждый раз занимает больше времени, когда выходит новый SteamCMD?

Потому что SteamCMD обновляет сам себя перед выполнением ваших команд всякий раз, когда Valve выпускает новый клиент. Первый запуск по расписанию после выхода клиента тратит на это дополнительное время. Это нормально, и именно поэтому лимит времени для задачи стоит делать щедрым.