1. In the script action definition you can pass predefined values to your command.
For example, to start a remote PS script and pass the datastorename as a parameter you could do
$tgtName = "ScriptServer"
$psExec = "C:\Temp\psexec.exe"
$psParms = " \\" + $tgtName + " cmd /c"
$psCommand = ' "echo . | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -noprofile -nologo -noninteractive c:\Temp\script.ps1 {datastoreName}"'
$alarm = Get-AlarmDefinition -Name "Test psexec"
New-AlarmAction -AlarmDefinition $alarm -Script -ScriptPath ($psExec + $psParms + $psCommand)
Via the $Args parameter you can access the passed value in your script.
In this script we add a script action to an existing alarm called "Test psexec".
2. These alarms will each start a PowerShell session to run your script.
These instances run in their proper environment, so they won't bother each other.
You are of course limited by the number of parallel (s)vMotions your vCenter allows.
But that should not be a problem, since the (s)vMotion tasks will be queued.