Командная строка выполняет команду иначе, чем пакетный файл и сценарий пост-сборки Visual Studio

У меня есть сценарий пост-сборки в Visual Studio, который я пытаюсь запустить, чтобы мы могли упростить удаленное развертывание. Ранее в этом скрипте (вы его здесь не видите) мы жестко запрограммировали пользователя в выполнении сетевого использования ниже. Таким образом, все, что мы здесь делаем, это то, что пользователь вводит имя сервера и базу данных для развертывания, а затем подключается к сетевому ресурсу этого сервера.

Однако я обнаружил, что приведенный ниже код работает нормально, только если вы запускаете его с помощью командной строки. Он открывает новое окно и помещает пользователя на сервер и базу данных, а затем команда net use правильно показывает серверу пользовательский ввод, все в том же окне.

Если вы попытаетесь использовать это в пакетном файле или в Visual Studio, команда net use покажет пустое имя сервера.

Я ценю любое понимание, которое у кого-то может быть по этому поводу!

START CMD /C "CALL SET /P SERVERNAME=Please Enter The Server Name: & CALL SET /P DATABASE=Please Enter The Database Name: & CALL CMD /C net use \\%SERVERNAME%\d$ /persistent:no * /user:%user%"

person NPVinny    schedule 05.02.2016    source источник
comment
Почему все start и call - они используются для исключительных обстоятельств. Также это все на 1 строке без уважительной причины. Исправьте свой код и посмотрите, что произойдет. И свалить все cmd /c.   -  person    schedule 05.02.2016
comment
Вызовы были тем, что я использовал для решения проблемы, связанной с тем, что третья инструкция не получает значение %SERVERNAME% в командной строке в первую очередь. Если у меня нет этих вызовов, переменная по-прежнему разрешается в %SERVERNAME%. Я должен иметь запуск и / или cmd в начале для события Post Build, потому что, если я этого не сделаю, Visual Studio ничего не откроет для пользовательского приглашения и просто зависнет, что является аналогичной причиной, почему это все на одном линия.   -  person NPVinny    schedule 05.02.2016


Ответы (1)


Следуйте советам @bgalea. Где определяется %user%? Вы имели в виду %username%? Конечно, эта схема не будет работать, если вы планируете, что сборка будет выполняться позже агентом сборки.

Причина, по которой это не работает, заключается в том, что переменные расширяются во время загрузки. Следовательно, %SERVERNAME% расширяется при загрузке строки... ДО того, как пользователь ввел значение. Попробуйте изменить на это:

SETLOCAL ENABLEDELAYEDEXPANSION SET /P SERVERNAME=Please Enter The Server Name: & SET /P DATABASE=Please Enter The Database Name: & \\!SERVERNAME!\d$ /persistent:no * /user:%username%"

Таким образом, вы будете использовать значение времени выполнения SERVERNAME.

person RGuggisberg    schedule 05.02.2016
comment
%user% — это жестко закодированная переменная, установленная ранее в нашем скрипте Post-Build (SET USER=avhost\vanderson_avctr). Ваш код работает, если я разделяю SETLOCAL ENABLEDELAYEDEXPANSION и остальные на отдельные строки для пакетной версии, но для Visual Studio он по-прежнему делает то, с чем у меня были проблемы раньше при попытке установить переменную с помощью пользовательского ввода, он просто зависает и не открывается что-либо. - person NPVinny; 05.02.2016