Loosely Decoupled
GuideAutomation

Install SteamCMD and a Steam Dedicated Server on Windows Server

SteamCMD and a dedicated server installed on Windows Server, checked by the success line, the executable and the build ID rather than the exit code.

A relaxed man in a hoodie holding a coffee prises open a delivery crate in a dim shed instead of trusting the paperwork on the floor. Inside the straw is a small cyan glowing core.
On this page

TL;DR

Unpack SteamCMD to C:\steamcmd, then install the server with one command that looks the app up first. The examples install 7 Days to Die, whose app ID is 294420. The app ID, the install folder, the server executable’s name and whether the game accepts +login anonymous are the game-specific parts, and the size you expect changes with them.

In PowerShell on the server:

PowerShell
New-Item -ItemType Directory -Path C:\steamcmd -Force | Out-Null
Invoke-WebRequest -Uri 'https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip' `
    -OutFile C:\steamcmd\steamcmd.zip -UseBasicParsing
Expand-Archive -Path C:\steamcmd\steamcmd.zip -DestinationPath C:\steamcmd -Force
Remove-Item C:\steamcmd\steamcmd.zip

C:\steamcmd\steamcmd.exe +force_install_dir "C:\7DaysToDieServer" +login anonymous `
    +app_info_print 294420 +app_update 294420 validate +quit

The install worked when the output contains Success! App '294420' fully installed. and C:\7DaysToDieServer\7DaysToDieServer.exe exists. Don’t go by the exit code. A fresh SteamCMD exits 7 on its first run, install or not.

Don’t run that command with validate later on a server whose serverconfig.xml you’ve edited, because validate restores the shipped file. Step 4 has the details.

If the output ends in ERROR! Failed to install app '294420' (Missing configuration) or Error! App '294420' state is 0x602 after update job., run the same command again. Both cleared on the second run in testing. Missing configuration is the one most likely to stop you, and +app_info_print prevents it on a fresh SteamCMD.

The install is one command, which is why the ways it misleads you on a fresh machine are easy to miss. The first run of SteamCMD updates itself and exits 7, including a run that installs the server. The first install on a fresh SteamCMD fails unless SteamCMD has already fetched the app’s record. A download of 16 GB can end with one corrupt file, and a rerun repairs it. An install path on a drive that doesn’t exist gets a Success! line and an install in the wrong folder. This part installs SteamCMD and the 7 Days to Die server and says how to tell a good install from a bad one. Finding the app ID for another game is the first part of this series.

1. Download and unpack steamcmd.zip

Run this in PowerShell on the server. It creates C:\steamcmd, downloads Valve’s steamcmd.zip into it, unpacks it and deletes the zip. The zip holds one file, steamcmd.exe, so there is no installer to run. -UseBasicParsing stops Invoke-WebRequest from parsing the download as a web page. Microsoft’s documentation (opens in a new tab) says Windows PowerShell requires it where Internet Explorer isn’t installed, and that after a December 2025 security update Invoke-WebRequest asks for confirmation without it, which stalls an unattended script.

PowerShell
New-Item -ItemType Directory -Path C:\steamcmd -Force | Out-Null
Invoke-WebRequest -Uri 'https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip' `
    -OutFile C:\steamcmd\steamcmd.zip -UseBasicParsing
Expand-Archive -Path C:\steamcmd\steamcmd.zip -DestinationPath C:\steamcmd -Force
Remove-Item C:\steamcmd\steamcmd.zip

SteamCMD fetches the rest of itself the first time it runs, and that run exits 7. Step 3 and the exit code section say how to check an install without the exit code.

2. Install the server with app_update

This writes about 16.5 GB under C:\7DaysToDieServer and downloads about that much, so the drive needs 17 GB free. Check that the drive exists and has the room: Get-PSDrive C | Select-Object Used, Free. The command, with each argument explained:

PowerShell
C:\steamcmd\steamcmd.exe +force_install_dir "C:\7DaysToDieServer" +login anonymous `
    +app_info_print 294420 +app_update 294420 validate +quit
ArgumentWhat it does
+force_install_dir "C:\7DaysToDieServer"The folder the server goes in. SteamCMD creates it. Keep the quotes
+login anonymousSigns in without an account. The first part of this series says which servers allow it
+app_info_print 294420Fetches the app’s record and prints it, about 550 lines. Without it, or an earlier run that signed in, the first install on a fresh SteamCMD fails
+app_update 294420 validateInstalls the app, or repairs an existing install by checking every file
+quitEnds the session. Without it SteamCMD stays open instead of exiting

Keep the quotes around the folder. Without them, a path with a space splits at the space. I ran a small app with +force_install_dir C:\scratch\p2 space\lit, and SteamCMD installed it into C:\scratch\p2, exited with code 0 and printed no warning. With the path in quotes it installed where I told it to.

On a fresh SteamCMD the first part of the output is SteamCMD updating itself. A complete download and install took about five to six minutes on this server. Near the end of a successful run the output reads as follows, and a few lines of shutdown messages follow it. The progress numbers differ from run to run:

Text
 Update state (0x101) committing, progress: 88.23 (15671513734 / 17761385525)
 Update state (0x0) unknown, progress: 0.00 (0 / 0)
Success! App '294420' fully installed.

3. Confirm the install

Check three things: the Success! line from step 2, the executable at the path you chose, and the manifest SteamCMD writes for the app. A path SteamCMD can’t use isn’t an error, as one of the failures shows, so look at the path and don’t rely on the Success! line alone. The last two checks are:

Command
PS> Test-Path C:\7DaysToDieServer\7DaysToDieServer.exe

Output

True
Command
PS> Select-String -Path C:\7DaysToDieServer\steamapps\appmanifest_294420.acf `
>     -Pattern '"(StateFlags|buildid)"' |
>     ForEach-Object { $_.Line.Trim() -replace '\t+', '  ' }

Output

"StateFlags"  "4"
"buildid"  "24994542"

StateFlags is 4 after a complete install. A failed install leaves a different value: the failed install in the 0x602 section left 1538. buildid is the build you installed. A later part uses it to decide whether Steam has published a newer one.

4. Run it again on an installed server

The same command works on a server that is already installed. A later part uses it to update. With validate it checks every file, which took from roughly 80 to 150 seconds for about 17,500 files here, and ends with the same fully installed line:

PowerShell
C:\steamcmd\steamcmd.exe +force_install_dir "C:\7DaysToDieServer" +login anonymous `
    +app_update 294420 validate +quit

Without validate it doesn’t check every file. On an up-to-date server it did nothing, took a few seconds and ended Success! App '294420' already up to date.

validate also restores every file to the version Valve ships, including serverconfig.xml. I changed ServerName and ServerMaxPlayerCount in that file and ran the command with validate. Both were back to the shipped values, and the file matched the shipped original. The same command without validate left my edit alone. A copy of the file under another name, and a note file that isn’t part of the install, survived validate. So keep your settings in a copy and start the server with -configfile= naming it. The next part does that.

Common failures

Missing configuration on the first install

Error

ERROR! Failed to install app '294420' (Missing configuration)

A fresh SteamCMD fails the first install before it downloads anything, and the same command succeeds when you run it again. I ran two or three trials of each case on a fresh SteamCMD with Core Keeper’s server (app 1963720), which is a small download:

  • The install as the first run exited 7 with the error.
  • The install after one +quit run, or two, exited 8 with the error.
  • The install with +app_info_update 1 added exited 8 with the error.
  • The install in the same command as a lookup of a different app, +app_info_print 440, exited 8 with the error.
  • The install in the same command as a lookup of the app itself, +app_info_print 1963720, succeeded every time.
  • The install after an earlier run that signed in, +login anonymous +quit, succeeded every time.
  • The install after an earlier run that looked up an app, the same one or a different one, succeeded every time.

So the first install fails unless SteamCMD has already signed in anonymously in an earlier run, or the same command looks up the app being installed. The 7 Days to Die server failed on a SteamCMD that had run +quit twice, and succeeded with +app_info_print 294420 in the same command. Either put the lookup before +app_update as in step 2, or run C:\steamcmd\steamcmd.exe +login anonymous +quit once before the install. I don’t know why either works.

Success! but the files are in the wrong folder

An install path that SteamCMD can’t use isn’t an error. With no drive Z: on the machine, this command printed Success! App '1963720' fully installed. and exited 0:

PowerShell
C:\steamcmd\steamcmd.exe +force_install_dir "Z:\nope" +login anonymous `
    +app_update 1963720 +quit

Nothing was created on Z:. The server went under the SteamCMD folder, in steamapps\common\Core Keeper Dedicated Server, with its manifest and executable. That happened in three of three trials. A folder that doesn’t exist yet on a drive that does, such as C:\7DaysToDieServer, is created. Check that the drive exists with Test-Path Z:\, and check that the executable exists at the path you chose.

state is 0x602 after update job at the end of the download

Error

Error! App '294420' state is 0x602 after update job.

The last progress line was 98.59%, and SteamCMD then rejected the files it had staged. logs\content_log.txt under the SteamCMD folder says why: Staged file validation failed (0 missing, 1 corrupt, 0 unreadable) (Corrupt update files). The server’s folder had no 7DaysToDieServer.exe and the manifest read StateFlags 1538. Run the same install command again. In my run the second one finished in 21 seconds with fully installed. It happened once in my first three complete installs from a fresh SteamCMD.

Exit code 7 and other codes that mislead

The exit code of steamcmd.exe doesn’t say whether the install worked:

  • The first run of a fresh SteamCMD exits 7. When that run also installs the server the output contains Success!, and when the install fails it exits 7 as well.
  • A refused install, for example No subscription, exits 8.
  • A command SteamCMD doesn’t know, for example +no_such_command, prints Command not found: no_such_command and exits 0.
  • An install path on a drive that doesn’t exist exits 0 and prints Success!, as the previous section shows.

Look for a Success! line in the output, and check that the executable exists at the path you chose. A Success! line is followed by a few lines of shutdown messages, so test for it with Select-String and not as the last line. A script that tests only $LASTEXITCODE calls a good first install a failure and a mistyped command a success.

No subscription

Error

ERROR! Failed to install app '223350' (No subscription)

That’s DayZ’s server, app 223350. The install was refused for an anonymous login. The ID is the game’s, or the server isn’t available anonymously, or no app has that ID. The first part of this series tells them apart.

Tested with

OS
Windows Server 2025 Datacenter (10.0.26100), virtual machine
PowerShell
Windows PowerShell 5.1, elevated
SteamCMD
client version 1788292693, anonymous login
Game
7 Days to Die dedicated server (294420), build 24994542
Date
October 2026

New articles, by email.

A short note when something new is published.