我想删除
url=https://
之前和.ap.ngrok.io
之后的所有内容意味着我只想要代码链接d045-113-172-146-154
这是 ngrok.log
t=2022-05-20T21:33:03+0700 lvl=info msg="no configuration paths supplied"
t=2022-05-20T21:33:03+0700 lvl=info msg="using configuration at default config path" path=C:\\Users\\Dell\\AppData\\Local/ngrok/ngrok.yml
t=2022-05-20T21:33:03+0700 lvl=info msg="open config file" path=C:\\Users\\Dell\\AppData\\Local\\ngrok\\ngrok.yml err=nil
t=2022-05-20T21:33:03+0700 lvl=info msg="starting web service" obj=web addr=199.0.0.1:4040
t=2022-05-20T21:33:03+0700 lvl=info msg="tunnel session started" obj=tunnels.session
t=2022-05-20T21:33:03+0700 lvl=info msg="client session established" obj=csess id=99dddre1f9ac
t=2022-05-20T21:33:03+0700 lvl=info msg="started tunnel" obj=tunnels name=command_line addr=http://localhost:80 url=https://d045-113-172-146-154.ap.ngrok.io
t=2022-05-20T21:33:18+0700 lvl=info msg="received stop request" obj=app stopReq="{err:<nil> restart:false}"
t=2022-05-20T21:33:18+0700 lvl=info msg="session closing" obj=tunnels.session err=nil
t=2022-05-20T21:33:18+0700 lvl=info msg="accept failed" obj=csess id=99dddre1f9ac err="reconnecting session closed"
我尝试了下面的代码,但它打印了
echo is off.
SetLocal EnableDelayedExpansion
set "input=ngrok.log"
set "substr=https://"
(
FOR /F "usebackq delims=" %%G IN ("%input%") DO (
set line=%%G
set id=!line:%substr%=!
)
)
echo %id% > yo.txt
set "substr2=.ap.ngrok.io"
(
FOR /F "usebackq delims=" %%G IN ("yo.txt") DO (
set line=%%G
set id2=!line:%substr2%=!
)
)
echo %id2%
可以使用以下批处理文件完成从包含完整 URL 的单行获取主机名的任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "ngrok.log" exit /B 2
for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /R "url=https://..*\.ap\.ngrok\.io" "ngrok.log"') do (
set "Data=%%I"
setlocal EnableDelayedExpansion
set "Data=!Data:*https://=!"
set "Data=!Data:.ap.ngrok.io=|!"
for /F "delims=|" %%J in ("!Data!") do (
endlocal
echo The hostname is: %%J
set "HostName=%%J"
)
)
if defined HostName echo The last hostname "%HostName%" can be used here, too.
endlocal
带有 FINDSTR 的命令行在后台使用另一个以选项
cmd.exe
开头的 /c
执行,并且 '
中的命令行作为附加参数附加。 FINDSTR 区分大小写地在当前目录下的文件 url=https://..*\.ap\.ngrok\.io
中搜索包含与正则表达式 ngrok.log
匹配的字符串的行,当然可以是任何目录,并且不能是包含批处理文件的目录。
由 FINDSTR 输出来处理 STDOUT 的行由
cmd.exe
处理批处理文件捕获,并在 findstr.exe
完成且后台命令进程自行关闭后由 FOR进行处理。
FOR 与
/F
会忽略空行,默认情况下也会忽略第一个空格/制表符分隔的子字符串以分号开头的所有行,否则仅将该行的第一个空格/制表符分隔的子字符串分配给指定的循环变量 I
进行进一步处理。这里不需要默认的行分割行为。因此,定义了一个空的字符串分隔符列表,并且没有行结束符,以便始终将每行 url=https://
和 .ap.ngrok.io
完全分配给循环变量 I
。
在启用延迟扩展之前,该行被分配到环境变量
Data
旁边。然后根据下一个字符串操作的需要启用延迟变量扩展。
首先删除数据行中直到第一次出现
https://
的所有内容。无法搜索包含等号的字符串,因为 =
被命令 SET 解释为搜索和替换字符串之间的分隔符。在本例中,替换字符串是空字符串。
接下来将所有出现的不区分大小写的解释搜索字符串
.ap.ngrok.io
替换为主机名不能包含的竖线,以标记剩余数据行中主机名的结尾。
还有一个 FOR /F 命令用于获取(第一个)垂直条左侧的字符串。预计该字符串不会以
;
开头,因为这将是一个非常不寻常的主机名。主机名被输出并分配给批处理文件中第二个命令行定义的本地环境中的环境变量HostName
。
如果日志文件中始终只有一个感兴趣的主机名,则还可以使用以下代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "ngrok.log" exit /B 2
for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /R "url=https://..*\.ap\.ngrok\.io" "ngrok.log"') do (
set "Data=%%I"
setlocal EnableDelayedExpansion
set "Data=!Data:*https://=!"
set "Data=!Data:.ap.ngrok.io=|!"
for /F "delims=|" %%J in ("!Data!") do (
endlocal
set "HostName=%%J"
goto HaveName
)
)
for %%I in ("ngrok.log") do echo ERROR: There is no hostname found in the log file: "%%~fI"
exit /B 1
:HaveName
echo Found the hostname "%HostName%" in the log file "ngrok.log".
rem Insert here more command lines for processing.
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
cmd /?
echo /?
endlocal /?
exit /?
findstr /?
for /?
goto /?
if /?
set /?
setlocal /?