PowerShell: 135119
Someone who understands RegEx better than I might be able to help trim this a bit.
Gofled Code
for(;!($x-cmatch'[acmatch'.*(?=.*[a-z]'z])+($x-cmatch'[A?=.*[A-Z]'Z])+($x-match'\d'?=.*\d)+($x-match'[?=.*[!-/:-@\[@[-`{-~]'~])-ne4.*')){$x='';1..15|%{$x+=[char](33..126|random)}}$x
Un-golfed and Commented
# Start a for loop definition.
for(
# Skip variable initialization, start definition of run condition.
;(
# CheckLoop runs if $x has a lowercase character.
$x-cmatch'[a-z]'
does not meet complexity )+(requirements.
# Check if $x has an uppercaseLength character.
requirement is not tested here because it is $x-cmatch'[A-Z]'
enforced by the generator )+(later.
# Much #thanks Checkto if@VasiliSyrakis $xfor hasthe aRegEx numberhelp.
!($x-match'\d'
cmatch'.*(?=.*[a-z])+(
# Check if $x has one of the required symbols?=.
$x*[A-match'[Z])(?=.*\d)(?=.*[!-/:-@\[@[-`{-~]'
# Run the script block if $x does not have all 4 character types included~]).
*')-ne4
)
{
# Reset $x in case the script block has already run.
$x='';
# Use ForEach-Object, via the % alias, to run a loop 15 times.
1..15|%{
# Append a random ASCII character from 33-126 to $x.
# Note: Use get-random instead of random for faster performance.
$x+=[char](33..126|random)
}
}
# Display $x.
$x
# Variable cleanup - not included in golfed code.
rv x