批处理文件删除单词前后的文本

batch file remove text before and after word

我想删除 url=https:// 之前和 .ap.ngrok.io 之后的所有内容意味着我只想要代码 link 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 在当前目录的文件 ngrok.log 中搜索 case-sensitive 包含与正则表达式 url=https://..*\.ap\.ngrok\.io 匹配的字符串的行,当然可以是任何目录,不能是包含批处理文件的目录。

FINDSTR 处理 STDOUT 的行输出被 cmd.exe 处理批处理文件并由 [= 处理61=]FOR findstr.exe 完成后后台命令进程自行关闭。

FOR with /F 忽略空行,默认情况下也忽略第一个 space/tab 分隔子字符串以分号开头的所有行,否则只分配首先 space/tab 分隔行的子字符串到指定的循环变量 I 以便进一步处理它。这里不需要默认的行拆分行为。因此,定义了一个空的字符串定界符列表并且没有行尾字符,以始终将 url=https://.ap.ngrok.io 的每一行完全分配给循环变量 I.

在启用延迟扩展之前,该行被分配到环境变量 Data 旁边。然后根据需要为接下来的字符串操作启用延迟变量扩展。

首先删除了从数据行到第一次出现 https:// 末尾的所有内容。无法搜索包含等号的字符串,因为 = 被命令 SET 解释为搜索和替换字符串之间的分隔符。在这种情况下,替换字符串是一个空字符串。

接下来将所有出现的 case-insensitive 解释搜索字符串 .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

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

  • cmd /?
  • echo /?
  • endlocal /?
  • exit /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?