Isso parece uma comparação injusta entre um lote mal escrito e um script completo (eu concordo que o cmd.exe é muito mais limitado). Por que você tira os 3 primeiros caracteres do nome da pasta ao desinstalar?
Esse lote pode funcionar:
@Echo off
for /D %%f in (*) do (
If exist "%f\setup.py" (
PushD "%%f"
pip uninstall "%%f"
pip install .
PopD
)
)