批处理 - 搜索 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 /?
,按 RETURN 或 ENTER 并阅读输出有助于理解这段小代码。
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%
以下信息包含在一个文本文件中,并按此格式设置。
/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 /?
,按 RETURN 或 ENTER 并阅读输出有助于理解这段小代码。
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%