批处理 - 搜索 part/exact 名称并将文本文件中的行作为 var 复制到批处理中

Batch - Search for part/exact name and copy line from text file into batch as var

以下信息包含在一个文本文件中,并按此格式设置。

/var/www/xxx/html/videos/video_folder_1
/var/www/xxx/html/videos/video_folder_2
/var/www/xxx/html/videos/video_folder_3
/var/www/xxx/html/videos/video_folder_4
/var/www/xxx/html/videos/video_folder_5
/var/www/xxx/html/videos/video_folder_6
/var/www/xxx/html/videos/video_folder_7

我在已经定义的批处理文件中还有一个名为 %file_name% 的变量。

所以可以说是 %file_name% = V001-video_folder_6.mp4

如您所见,还有一些额外的信息,V001-.mp4

我想使用 var %file_name% 来搜索文本文件和 return 整行。在这种情况下,它将 return /var/www/xxx/html/videos/video_folder_6 然后将此信息放入一个新的变量中,比方说,%folder_path%.

我想我会使用 findstr 但是我一直在尝试并没有得到最好的结果。

这应该有效:

::file_name=V001-video_folder_6.mp4
::file containing folder paths is called paths.txt

for /f "tokens=2 delims=-." %%a in ("%file_name%") do set FN=%%a
for /f %%a in ('findstr /E /L "%FN%" "paths.txt"') do set folder_path=%%a
echo %folder_path%

在两行中有效地完成你想要的。

让我们假设发布的行在当前工作目录的文件 Test.txt 中。

@echo off
set "file_name=V001-video_folder_6.mp4"
for /F "tokens=2 delims=-." %%A in ("%file_name%") do set "folder=%%A"
for /F "delims=" %%P in ('%SystemRoot%\System32\findstr.exe "/C:%folder%" Test.txt') do (
    set "folder_path=%%P"
    goto NextCommand
)
:NextCommand
echo Full folder path is: %folder_path%

打开命令提示符 window,输入命令 for /?,按 RETURNENTER 并阅读输出有助于理解这段小代码。

FOR 循环中的命令 goto 导致在第一个找到包含感兴趣的文件夹路径的行后立即退出 findstr.exe 的循环处理输出.

如果在文本文件中找不到搜索到的文件夹,可能更好:

@echo off
set "file_name=V01-VIDEOS for school (Miss Patrick).mp4"
for /F "tokens=2 delims=-." %%A in ("%file_name%") do set "folder=%%A"
for /F "delims=" %%P in ('%SystemRoot%\System32\findstr.exe "/C:%folder%" Test.txt') do (
    set "folder_path=%%P"
    goto FoundFolder
)
echo "%folder%" not found in file Test.txt.
pause
goto :EOF
:FoundFolder
echo Full folder path is: "%folder_path%"
pause

使用findstr 的方法的问题是它们很慢,因为它们每次都需要执行findstr.exe(一个~30KB 的文件)。 simpler/faster 解决方案是在 array 的帮助下仅使用内部 Batch 命令。如果需要处理的名字数量较多,可能会标出两种方法的时间差。

@echo off
setlocal EnableDelayedExpansion

rem Load the lines from text file into an array with the last part as index:
for /F "delims=" %%a in (test.txt) do (
   set "line=%%a"
   for %%b in (!line:/^= !) do set "lastPart=%%b"
   set "folder[!lastPart!]=%%a"
)

set "file_name=V001-video_folder_6.mp4"

rem Get the folder from file_name:
for /F "tokens=2 delims=-." %%a in ("%file_name%") do set "folder_path=!folder[%%a]!"

echo Folder path is: %folder_path%