This is in essence a duplicate of this question, but that one is for adding items to the list of PreProcessorDefinitions which is not exactly the same as overriding WarningLevel, which can only have one value. So here it goes: WarningLevel isn't a global property, like OutDir, but it's part of the ClCompile ItemDefinitionGroup so you cannot set it directly. It looks somewhat like this in the project file:
<PropertyGroup>
<!-- global property, can be overridden on commandline -->
<OutDir>$(ProjectDir)$(Configuration)$(Platform)</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<!-- not a global property -->
<WarningLevel>Level4</WarningLevel>
</ClCompile>
<ItemDefinitionGroup>
Two ways to deal with this, see answers for the linked question:
First option is to set the WarningLevel to another property which you then define on the commandline. Go to Project Properties->Configuration Properties->C/C++->General->Warning Level and enter $(MyWarningLevel). In the project file, this looks like
<ItemDefinitionGroup>
<ClCompile>
<!-- gets it's value from a global property now -->
<WarningLevel>$(MyWarningLevel)</WarningLevel>
</ClCompile>
<ItemDefinitionGroup>
and it's set using msbuild myproj.vcxproj /p:MyWarningLevel=Level3
. If not set explicitly the default value will be used.
Second option is to use one of the msbuild/C++ extension points. Create a file named override.props or so containing
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup $(PUT_IN_YOUR_CONDITION)>
<ClCompile>
<WarningLevel>Level4</WarningLevel>
</ClCompile>
</ItemDefinitionGroup>
</Project>
and have msbuild pick it up with msbuild myproj.vcxproj /p:ForceImportBeforeCppTargets=/path/to/override.props