PowerShell netsh 内联命令无法正常工作
PowerShell netsh inline command not working properly
当我运行
PS C:\WINDOWS\system32> wsl hostname -I
172.27.96.44
PS C:\WINDOWS\system32> netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=172.27.96.44
PS C:\WINDOWS\system32> 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:\WINDOWS\system32> netsh interface portproxy show all
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
* 3000 172.27.96.44 3000
目标地址不可访问。它只是没有回应。尽管它显示在 table 中。
我尝试了字符串转换,例如
netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=([string] (wsl hostname -I));
但这并没有帮助。
为什么即使 IP 地址在 table 中也不起作用?
如果您获取 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
VS
'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。我猜了一下,确实是一个space。
$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
当我运行
PS C:\WINDOWS\system32> wsl hostname -I
172.27.96.44
PS C:\WINDOWS\system32> netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=172.27.96.44
PS C:\WINDOWS\system32> 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:\WINDOWS\system32> netsh interface portproxy show all
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
* 3000 172.27.96.44 3000
目标地址不可访问。它只是没有回应。尽管它显示在 table 中。 我尝试了字符串转换,例如
netsh interface portproxy add v4tov4 listenport=3000 connectport=3000 connectaddress=([string] (wsl hostname -I));
但这并没有帮助。 为什么即使 IP 地址在 table 中也不起作用?
如果您获取 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
VS
'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。我猜了一下,确实是一个space。
$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