Встроенная команда PowerShell netsh не работает должным образом

powershell #netsh

#powershell #netsh

Вопрос:

Когда я запускаю

 PS C:WINDOWSsystem32> wsl hostname -I
172.27.96.44
PS C:WINDOWSsystem32> netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=172.27.96.44
PS C:WINDOWSsystem32> netsh interface portproxy show all

Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               3000        172.17.218.173  3000
 

Это работает, целевой адрес доступен. Но когда я запускаю

 netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=$(wsl hostname -I)

PS C:WINDOWSsystem32>  netsh interface portproxy show all

Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               3000        172.27.96.44    3000
 

Целевой адрес недоступен. Он просто не отвечает. Даже несмотря на то, что это показано в таблице.
Я пробовал преобразования строк, например

 netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=([string] (wsl hostname -I));
 

Но это не помогло.
Почему это не работает, даже если IP-адрес указан в таблице?

Ответ №1:

Если вы возьмете выходные данные вашей команды WSL и дословную строку того, что, по вашему мнению, является одним и тем же значением, и сравните фактические байты Format-Hex , вы увидите, что есть разница.

 $output = WSL hostname -I

$output | Format-Hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   31 39 32 2E 31 36 38 2E 31 2E 36 38 20           192.168.1.68
 

против

 '192.168.1.68' | Format-Hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   31 39 32 2E 31 36 38 2E 31 2E 36 38              192.168.1.68
 

Итак, он добавляет значение, 20. Я предположил, и это действительно пробел.

 $output -replace 's' | Format-Hex

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   31 39 32 2E 31 36 38 2E 31 2E 36 38              192.168.1.68
 

Таким образом, вы можете решить эту проблему различными способами, но, как показано, это может быть так просто, как.

 $output = (WSL hostname -I) -replace 's'
 

Вы всегда можете проверить содержимое своей переменной. Я регулярно делаю что-то подобное только для проверки работоспособности. Это определенно спасло бы вас здесь.

 $output = WSL hostname -I

Write-Host "A$($output)A"

A192.168.1.68 A
 

Комментарии:

1. Хорошая слежка; "connectaddress=$((wsl hostname -I).Trim())" должно сработать.

2. А также "connectaddress=$((wsl hostname -I).Trimend())"

3. В качестве отступа: эта суть содержит функцию Debug-String , которая может быть полезной; например, 'ab ' | Debug-String выходные ab· данные (точка представляет конечный пробел). Он также может представлять символы, отличные от ASCII, в виде escape-последовательностей Unicode -UnicodeEscapes .

4. Спасибо всем. Это работает.