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. Спасибо всем. Это работает.