Передать netconnectionid в команду интерфейса netsh в пакетном режиме

Я пытаюсь написать пакетный скрипт, который будет извлекать netconnectionid из wmin nic, а затем передавать каждое из возвращенных значений в команду netsh, которая сообщит интерфейсу, чтобы он получил IP-адрес от DHCP.

Вот что у меня есть на данный момент (не работает)

@echo Off
For /f "tokens=2" %%a In ('wmic nic where "netconnectionid like '%%'" get netconnectionid /value') Do (
    Call :dhcp "%%a %%b"
)
pause
exit

:dhcp
netsh interface ip set address %%b dhcp

Причина, по которой сценарий необходим вместо запуска команд для подключения по локальной сети или беспроводного сетевого подключения, заключается в том, что этот сценарий будет запускаться на машинах, где netconnectionid больше не соответствует стандарту.

Будучи новичком в пакетной обработке, у меня возникают проблемы с расшифровкой цикла и того, где именно он идет не так.


person Zachariah    schedule 19.11.2014    source источник


Ответы (1)


Вы были очень близки. Самое главное, что вам нужно было указать разделитель, который будет использоваться для разбора строки. Поскольку эта команда wmic будет возвращать такие строки, как «NetConnectionId=Local Area Connection», вам нужно указать, что вы хотите разделить строку на = вместо пробелов, как это обычно бывает.

Во-вторых, когда вы вызываете функцию, вы можете получить доступ к переданным в нее параметрам с помощью %1 для первого параметра, %2 для второго параметра и т. д.

@echo off

:: tokens=2 indicates that of all the tokens that would normally be returned, we only want the second one
:: delims== indicates that the string should be split up wherever there is an = symbol
for /f "tokens=2 delims==" %%A in ('wmic nic where "netconnectionid like '%%'" get netconnectionid /value') do (
    call :dhcp "%%A"
)
pause
exit /b

:dhcp
:: %~1 refers to the first parameter passed into the function, but without the quotation marks
netsh interface set address %1 dhcp
person SomethingDark    schedule 19.11.2014
comment
Я боюсь, что это вернет следующую ошибку: Неверный исходный параметр (область) - person Zachariah; 19.11.2014
comment
Возможно, кавычки все-таки были необходимы. Удалите символ ~ из последней строки и посмотрите, работает ли это. - person SomethingDark; 19.11.2014
comment
Кроме того, netsh interface /? говорит мне, что ip не является допустимым параметром. Есть ipv4 и ipv6, но вы не можете использовать их одновременно с установленным, поэтому удалите и его. - person SomethingDark; 19.11.2014
comment
Ах, это, кажется, исправило мою проблему. Я знал, что должен быть рядом, но не мог этого понять. Большое Вам спасибо. Я использовал ip, не объявленный как ipv4 или ipv6, и он работал без проблем на 7 и 8. Он может быть нацелен на оба, а не на конкретный интерфейс. Один вопрос в будущем: если на машине есть несколько сетевых адаптеров, должна ли быть команда для запуска %2? - person Zachariah; 19.11.2014
comment
Прямо сейчас цикл for запускает dhcp для каждого найденного им netconnectionid, поэтому, если на машине есть несколько сетевых адаптеров, команда будет запускаться для всех из них. %2 будет использоваться, если вы по какой-то причине передали функции второй параметр, но в текущем коде этого делать не нужно. - person SomethingDark; 19.11.2014
comment
Еще раз спасибо. Это было мое понимание кода, но я считаю, что лучше знать наверняка, чем потом получать нежелательные сюрпризы. - person Zachariah; 19.11.2014