批处理脚本:for /F 执行命令后不执行任何操作

Batch script : for /F does nothing after executing a command

此脚本的目标是从计算机保存的网络中显示每个 WiFi 设备及其密钥。

预期输出:

<device_name1> : <key>
<device_name2> : <key>
<device_name3> : <key>
<device_name4> : <key>

这是当前脚本: (它只显示设备和密钥的前 4 个字符)

@echo off
setlocal EnableDelayedExpansion
goto :main


:getKey
for /F "tokens=2 delims=: usebackq" %%B in (`netsh wlan show profiles name=%1 key=clear ^| find "Key Content"`) do (
        set _clear_key=%%B
)
goto :eof


:main
for /F "tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| find "User Profile"') do (
    set _profile_name=%%A
    set _profile_name=!_profile_name%:~1!
    
    set _clear_key=aaaaaaa
    
    call :getKey !_profile_name!
        
    echo !_profile_name%:~0,4! : !_clear_key%:~0,4!
)

pause
goto :eof

当前输出:

Free : aaaa
TP-L : aaaa
Bbox : aaaa
...

我猜变量没有正确应用在命令中,没有循环。但是,我已经将这种语法用于其他脚本,它应该可以工作。

我完全找不到为什么这不起作用 T^T


Free :
    Key Content            : v6v...
TP-L :
    Key Content            : 844...
Bbox :
    Key Content            : 7pf...
...

(使用脚本)

@echo off
setlocal EnableDelayedExpansion
for /F "tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| find "User Profile"') do (
    set _profile_name=%%A
    set _profile_name=!_profile_name%:~1!
    
    echo !_profile_name%:~0,4! :
    netsh wlan show profiles name=!_profile_name! key=clear | find "Key Content"
)
pause

我希望我没有犯一个愚蠢的错误。 这个项目并不重要,所以请不要 spend/waste 花太多时间来解决我的问题。

感谢 @Hackoo 在我原来问题的评论中,我的问题已经解决了。

我只是没有转义命令netsh wlan show profiles name=%1 key=clear ^| find "Key Content"

中的=

如果有人需要的话,这是最后的脚本:

@echo off
setlocal EnableDelayedExpansion
goto :main

:getKey
for /F "tokens=2 delims=: usebackq" %%B in (`netsh wlan show profiles %1 key^=clear ^| find "Key Content"`) do (
        set _clear_key=%%B
        set _clear_key=!_clear_key:~1!
)
goto :eof

:main
for /F "tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| find "User Profile"') do (
    set _profile_name=%%A
    set _profile_name=!_profile_name:~1!
    set _clear_key=No password
    
    call :getKey !_profile_name!
    
    echo !_profile_name:~0! : !_clear_key:~0!
)
pause
exit /b

以下批处理文件代码可用于获取 PC 上的 WLAN 密钥 运行 英文 Windows:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1* delims=:" %%G in ('%SystemRoot%\System32\netsh.exe wlan show profiles 2^>nul ^| %SystemRoot%\System32\find.exe "User Profile"') do for /F "tokens=*" %%I in ("%%H") do for /F "tokens=1* delims=:" %%J in ('%SystemRoot%\System32\netsh.exe wlan show profiles name^="%%I" key^=clear ^| %SystemRoot%\System32\find.exe "Key Content"') do for /F "tokens=*" %%L in ("%%K") do echo Key for wlan %%I is: %%L
endlocal

cmdFOR[=53 中的所有逗号、分号、等号和 no-break spaces 替换为正常的 spaces =] 不在双引号参数字符串中。出于这个原因,有必要转义第三组 FOR^ 中的所有等号,以便从字面上解释它们。此代码甚至适用于包含 space、冒号或感叹号的 wlan 网络名称和安全密钥。

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • find /?
  • for /?
  • netsh /?
  • netsh wlan /?
  • netsh wlan show /?
  • netsh wlan show profiles /?
  • setlocal /?

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul| 的解释。重定向运算符 >| 必须在 FOR 命令行上使用脱字符 ^ 进行转义,以便在 [=68= 时将其解释为文字字符] 命令解释器在执行命令 FOR 之前处理此命令行,该命令在后台启动的单独命令进程中执行嵌入式命令行 %SystemRoot%\System32\cmd.exe /c 和 [=28= 内的命令行] 作为附加参数附加。