This documentation seems to apply to Python toolbox code, but not to script tools. .value.value seems to be necessary within Python toolbox tools in some cases, but not in others. Here's an example where the CalculateField tool would not work until I used value.value:def execute(self, parameters, messages):
# From combineFields.py
# Purpose: Create a new field that is the sum of two existing fields.
dataset = parameters[0].value.value
field1 = parameters[1].value
field2 = parameters[2].value
newfield = parameters[3].value
arcpy.AddField_management(dataset, newfield)
expression = '!{0}!+!{1}!'.format(field1, field2)
arcpy.CalculateField_management(dataset, newfield, expression, 'PYTHON')
arcpy.SetParameterAsText( 4,dataset)
And another example (like the documentation) where os.path.dirname won't work without the double 'value' (though the linear distance works fine as a value object passed into the buffer tool): fileToBuffer = parameters[0].value.value
distance = parameters[1].value
arcpy.env.workspace = os.path.dirname(fileToBuffer)
outputFile = os.path.splitext(fileToBuffer)[0] + 'Buff'
arcpy.Buffer_analysis(fileToBuffer, outputFile, distance)