Here’s an interesting gotcha if you are spawning a new window for asynchronous execution via the "cmd.exe /c start" hack. This works as expected in a script, but doesn’t work in a module.
$start = get-date
cmd /c start powershell -command "start-sleep 20"
write-host "$([int]((get-date) - $start).TotalSeconds) seconds";
Even odder, you can Import-Module Example.ps1 and have it come back immediately after powershell initialization. However, if you Import-Module Example.psM1, it will block until the cmd.exe process finishes.
I tried to come up with a rationale for why this works in a .ps1 but not in a .psm1, but...I got nuthin'