Вопреки вашему названию, источником проблемы является username
, а не userprofile
.
Обычно ОС устанавливает обе эти переменные (среди прочих), и это виднокак плохая практика программирования для изменения их содержимого.
Я подозреваю, что был запущен предыдущий пакет, который изменил username
- это привлекательное и значимое имя переменной для использования неопытными дозаторами.
Другойпризнаком неопытности является отсутствие команды setlocal
непосредственно после @echo off
.В то время как это не обязательное , оно гарантирует, что изменения, внесенные партией в среду, отбрасываются по окончании партии, поэтому они не накапливаются при последующих запусках партии.
Поэтому я бы проверилчто username
непусто при запуске этого пакета, поэтому, возможно, добавьте
echo username=%username%
if not defined username echo no username&pause&goto :eof
после @echo off
для предупреждения и отмены.
В другом месте в сценарии userprofile
- этоиспользуемый.Я не вижу причин для изменения указанных строк на c:\users\%username%
, поскольку обычно будет таким же, как %userprofile%
.
После публикации соответствующихдеталь:
@ECHO OFF
SETLOCAL
SET "user_name=!M D!"
SET "destdir=U:\destdir"
SETLOCAL ENABLEDELAYEDEXPANSION
DIR /ad "%destdir%"
ECHO ---------------------------------
MD "%destdir%\%user_name%\Banquo's ghost"
DIR /ad "%destdir%"
ECHO ---------------------------------
SETLOCAL DISABLEDELAYEDEXPANSION
MD "%destdir%\%user_name%\Banquo's ghost"
DIR /ad "%destdir%"
ECHO ---------------------------------
GOTO :EOF
Проблема в том, что ваше имя пользователя !M D!
, и вы вызвали delayedexpansion
, поэтому пакет заменяет значение переменной username
(я использовал user_name
, так как мне не нравитсяизменяя системные переменные), следовательно, ...!M D!...
и затем подставляет значение M D
, которое пусто .
Приведенная выше демонстрация дублирует вашу ситуацию, сообщает о текущей попытке создать каталогзатем лекарство - выключить delayedexpansion
.