Переменная пакетного сценария не работает правильно - PullRequest
2 голосов
/ 08 сентября 2011

Что ж ... Я стараюсь как можно меньше играть в пакетном режиме, и я в основном человек C / C # / C ++. Моя проблема в том, что мой сценарий выполняет два вложенных цикла FOR, где я сначала запускаю папку «Users» и зацепляю имена пользователей, а затем через другие папки:

 set BaseDir=%CD%
 cd C:\Users
 for /F %%I in ('DIR *.* /B /O:-D') do (
     set UserName=%%I
     echo %UserName%
 )
 cd %BaseDir%

Это примерно демонстрирует проблему. Может быть, это мое форматирование в стиле C ++? Может быть, я тупой, когда дело доходит до партии? Предполагая, что в моей системе 3 пользователя (Admin, User1, User2; в таком порядке), будет напечатано:

 Admin
 Admin
 Admin

Totes неправильно. Если бы вы вызвали echo на %% I, все бы пошло по плану:

 Admin
 User1
 User2

Я что-то упускаю здесь, что касается переменных, или в чем дело? DOS не любит переназначение переменных? Спасибо заранее. (спецификации: Windows 7, блокнот, cmd от имени администратора)

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Другой вариант - использовать подпрограмму:

 pushd C:\Users
 for /F %%I in ('DIR *.* /B /O:-D') do call :perfile %%I
 popd
 goto :eof

 :perfile
 set UserName=%*
 echo %UserName%
 goto :eof

Также обратите внимание на использование pushd и popd, чтобы избежать необходимости сохранять исходный каталог в переменной окружения.

2 голосов
/ 08 сентября 2011

Поскольку вы изменяете переменную в цикле FOR, вам необходимо включить отложенные расширения:

SETLOCAL ENABLEDELAYEDEXPANSION
cd C:\Users
for /F %%I in ('DIR *.* /B /O:-D') do (
 set UserName=%%I
 echo %UserName%
)

EDIT Удобный способ назначать переменные отдельно для доступа к каждому экземпляру вне цикла

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
    cd C:\Users
    for /F %%I in ('DIR *.* /B /O:-D') do (
     set UserName!count!=%%I
     echo %UserName!count!%
     set count=!count!+1
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...