批处理脚本: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
- 命令
netsh wlan show profiles name=!_profile_name! key=clear | find "Key Content"
在第一个循环中工作,但我无法与键交互(下面的示例)
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
- 我已经为“for /F”循环(以及其他选项)尝试了使用和不使用 usebackq
- 与第一个循环中的
:getKey
部分相同
- 使用和不使用 EnableDelayedExpansion 时相同(并使用 %var%、!var!、%1、%%B、%%K、...)
我希望我没有犯一个愚蠢的错误。
这个项目并不重要,所以请不要 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
cmd
将 FOR[=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= 内的命令行] 作为附加参数附加。
此脚本的目标是从计算机保存的网络中显示每个 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
- 命令
netsh wlan show profiles name=!_profile_name! key=clear | find "Key Content"
在第一个循环中工作,但我无法与键交互(下面的示例)
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
- 我已经为“for /F”循环(以及其他选项)尝试了使用和不使用 usebackq
- 与第一个循环中的
:getKey
部分相同 - 使用和不使用 EnableDelayedExpansion 时相同(并使用 %var%、!var!、%1、%%B、%%K、...)
我希望我没有犯一个愚蠢的错误。 这个项目并不重要,所以请不要 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
cmd
将 FOR[=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= 内的命令行] 作为附加参数附加。