批处理脚本编写另一个批处理脚本,其代码中包含 for 循环

问题描述 投票:0回答:2

下面是我的批处理脚本 USB中的Batch1.bat

setlocal enabledelayedexpansion
for /f "tokens=2delims=:" %%a in ('netsh wlan show profile ^|findstr ":"') do (set "ssid=%%~a" & call :getpwd "%%ssid:~1%%")
:getpwd
set "ssid=%*"
for /f "tokens=2delims=:" %%i in ('netsh wlan show profile name^="%ssid:"=%" key^=clear ^| findstr /C:"Key Content"') do echo ssid: %ssid% pass: %%i >> c:\Wifi.txt

我正在编写另一个批处理脚本,它使用 echo 来编写上面的批处理脚本,如下所示:

@echo off
echo setlocal enabledelayedexpansion >>c:\batch2.txt
echo for /f "tokens=2delims=:" %%%%a in ('netsh wlan show profile ^^^|findstr ":"') do (set "ssid=%%%%~a" ^& call :getpwd "%%%%ssid:~1%%%%") >>c:\batch2.txt
echo set "ssid=%%*" >>c:\batch2.txt
echo for /f "tokens=2delims=:" %%%%i in ('netsh wlan show profile name^^="%%ssid:"=%%" key^=clear ^^^| findstr /C:"Key Content"') do echo ssid: %%ssid%% pass: %%%%i >> c:\Wifi.txt >>c:\batch2.txt

但是第 5 行没有被回显和写入。尝试过各种逃避。请任何人帮忙。

echo for /f "tokens=2delims=:" %%%%i in ('netsh wlan show profile name^^="%%ssid:"=%%" key^=clear ^| findstr /C:"Key Content"') do echo ssid: %%ssid%% pass: %%%%i >> c:\Wifi.txt >>batch2.txt
pause

通常 echo 可以工作,但将其重定向到文件 batch2.txt 时不起作用

也尝试过^>^> c:\Wifi.txt

但是没有任何效果

batch-file
2个回答
1
投票

这是使用您的

echo
方法的一个示例,未提供任何解释:

@(  Echo @(For /F "Tokens=2 Delims=:" %%%%G In ('%%SystemRoot%%\System32\netsh.exe WLAN Show
    Echo  Profiles 2^^^>NUL ^^^| %%SystemRoot%%\System32\find.exe ":"'^) Do @(Set "Profile=%%%%G"
    Echo    Call :GetPwd "%%%%Profile:~1%%%%"^)^) 1^>"C:\WiFi.txt"
    Echo @GoTo :EOF
    Echo(
    Echo :GetPwd
    Echo @For /F "Tokens=2 Delims=:" %%%%G In ('%%SystemRoot%%\System32\netsh.exe WLAN Show
    Echo  Profiles Name^^^="%%~1" Key^^^=clear ^^^| %%SystemRoot%%\System32\find.exe "Key Content"
    Echo  '^) Do @Echo Profile: %%~1 Pwd:%%%%G) 1>"C:\batch2.txt"

请注意,我已根据您的示例保留了输出文件名和路径。但是,对于您选择的位置,您可能需要以提升的权限或以具有非标准权限的用户身份运行脚本。标准用户通常没有对

C:
驱动器
C:\
根目录的写入权限。
3
9
行末尾的双引号之间的这两个文件路径是在测试上述代码之前您唯一应该选择更改的内容。我不会为任何其他更改提供答案支持。


1
投票

由于多种原因,问题中的批处理文件中的第五行无法按预期工作。但是,即使对 Windows 命令处理器

cmd.exe
有特殊含义的所有字符都被正确转义以将命令行写入
c:\batch2.txt
,命令行也无法工作。

以下批处理文件代码可用于创建

%Temp%\Batch2.cmd

@echo off
(
echo @echo off
echo setlocal EnableExtensions DisableDelayedExpansion
echo (for /F "tokens=1* delims=:" %%%%G in ('%%SystemRoot%%\System32\netsh.exe wlan show profile 2^^^>nul ^^^| %%SystemRoot%%\System32\find.exe ":"'^) do for /F "tokens=*" %%%%I in ("%%%%H"^) do for /F "tokens=3*" %%%%J in ('%%SystemRoot%%\System32\netsh.exe wlan show profile name^^="%%%%I" key^^=clear ^^^| %%SystemRoot%%\System32\find.exe "Key Content"'^) do echo ssid: %%%%I pass: %%%%K^)^>"%~dp0Wifi.txt"
echo del "%%~f0" ^& exit
) >"%Temp%\batch2.cmd"
endlocal

创建的批处理文件

%Temp%\batch2.cmd
必须以本地管理员的提升权限运行,这很可能是该批处理文件应创建另一个批处理文件的原因。

如果

%Temp%\batch2.cmd
是包含上述批处理文件的目录,则创建的批处理文件
C:\Temp
包含以下行:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
(for /F "tokens=1* delims=:" %%G in ('%SystemRoot%\System32\netsh.exe wlan show profile 2^>nul ^| %SystemRoot%\System32\find.exe ":"') do for /F "tokens=*" %%I in ("%%H") do for /F "tokens=3*" %%J in ('%SystemRoot%\System32\netsh.exe wlan show profile name^="%%I" key^=clear ^| %SystemRoot%\System32\find.exe "Key Content"') do echo ssid: %%I pass: %%K)>"C:\Temp\Wifi.txt"
del "%~f0" & exit

此批处理文件获取每个存储的 WLAN 的 SSID 名称和 WLAN 密码,并将它们写入上述批处理文件目录(USB 连接存储介质)中的文件

Wifi.txt
中。第二个批处理文件会使用最后一个命令行删除自身。该代码比问题中使用的代码要好得多,因为它甚至适用于包含感叹号的 SSID 名称或 WLAN 密码。

根本不需要从一个批处理文件中再创建一个批处理文件来以管理员身份运行它。实际上只需要一个批处理文件,如果不在本地管理员具有提升权限的环境中执行,该批处理文件会提示用户提升权限,然后运行命令行以将感兴趣的 WLAN 数据写入文本文件。有关更多详细信息,请参阅我在 Can't run as Admin.

上的回答。
© www.soinside.com 2019 - 2024. All rights reserved.