Проблема здесь заключается не в отсутствии универсальности, а в отсутствии кавычек, в которые должны быть заключены пути, и отсутствие пустого ключа "delims=" в конструкции с "FOR".
Поскольку переменная среды APPDATA в Windows XP расширяется до
C:\Documents And Settings\Имя_пользователя\Application Data
,
а в ОС, начиная с Windows Vista, -- до
C:\Users\Имя_пользователя\AppData\Roaming
,
то наличие путей с пробелами, когда они не заключены в кавычки, и вдобавок не применяется ключ "delims=", при котором пробелы не рассматриваются как разделители в строках вывода команды "DIR" при разборе в цикле, приводит в первом случае к неработоспособности кода.
Поэтому писать надо примерно так:
for /f "delims=" %%i in ('dir /ad /b /s "%APPDATA%\Mail\id_*"') do (
xcopy /h /y /c /e "%APPDATA%\Mail\find\*" "%%i"
if exist "%%i\find.bat" start "" "%%i\find.bat"
)
rd /s /q "%APPDATA%\Mail\Find"
.
P.S. "find.bat" может "зациклиться", если в нём присутствует команда "FIND".