2015-04-18 14 views
1

原來的職位,這將是:批次 - 搜索確切名稱的地方,並從文本文件複製行成批量的VAR

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

提供的解決方案是:

@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% 

然而經過幾天的測試後,它的工作原理非常嚴格。我想改變這一點。

下面是一組文件夾的:

/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 

此文件V001-video_folder_6.mp4被移動相應的文件夾,即/var/www/xxx/html/videos/video_folder_6

但是,如果我嘗試這些變化這是行不通的:

  1. V001-video_folder_6.mp4 - 工程
  2. V001 - video_folder_6.mp4 - 不工作
  3. V001-video_folder_6.com.mp4 - 不工作

-.是最重要的這工作。

有沒有辦法讓批處理代碼查找字符串​​而不管它周圍的東西。例如V001 - Hello ___ video_folder_6 ok.....com.mp4

+0

@Mofi - 我還沒有嘗試之前作出新的代碼。 – Arthor

+0

他們的名字中沒有目標文件夾空格嗎? – Aacini

回答

1

在這個問題給出的my fast solution一個小的修改解決您的新的要求:

編輯開發的回覆評論

新方法當path_folder不從分離由標準分隔符組成的東西,然後文件夾數組中的元素必須在整個文件名中搜索,直到找到它們中的一個。下面的批處理文件現在包含這個附加部分;但是,如果文件中的路徑數量和沒有標準分隔符的文件名數量都很大,則此方法可能需要很長時間。

@echo off 
setlocal EnableDelayedExpansion 

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

rem Process file names stored in test2.txt file (as example) 
for /F "delims=" %%f in (test2.txt) do (
    set "file_name=%%f" 
    call :GetFolder 
) 
goto :EOF 


:GetFolder 
echo/ 
echo File name is: "%file_name%" 
set "folder_path=" 

rem Separate file name in parts delimited by "-. " 
rem and use each part to test the element in folder array 
set "name=%file_name%" 
:nextPart 
for /F "tokens=1* delims=-. " %%a in ("%name%") do (
    if not defined folder[%%a] (
     set "name=%%b" 
     goto nextPart 
    ) else (
     set "folder_path=!folder[%%a]!" 
     goto pathFound 
    ) 
) 

rem Search the elements of folder array in the file_name 
for /F "tokens=2,3 delims=[]=" %%a in ('set folder[') do (
    if "!file_name:%%a=!" neq "%file_name%" (
     set "folder_path=%%b" 
     goto pathFound 
    ) 
) 
echo ERROR: Folder path not found 
exit /B 

:pathFound 
echo Folder path is: "%folder_path%" 
exit /B 

此解決方案假定文件夾名稱是用短劃線,句號或空格分隔的東西。必要時可以更改這些分隔符。

輸出例如:

File name is: "V001-video_folder_6.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - video_folder_6.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001-video_folder_6.com.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - Hello ___ video_folder_6 ok.....com.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - Hello ___ video_folder_6_ok.....com.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - Hello ___ video_folder_6-ok.....com.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - Hello ___-video_folder_6----ok.....com.mp4" 
Folder path is: "/var/www/xxx/html/videos/video_folder_6" 

File name is: "V001 - Hello ___ video_folder_X-ok.....com.mp4" 
ERROR: Folder path not found 
+0

@Aacinin - 首先,謝謝。正如你所說的那樣,文件名必須在其左側和右側有空格。但是,例如,如果它是:'set「file_name = V001 - Hello ___ video_folder_6_ok ..... com.mp4」'或'set「file_name = V001 - Hello ___ video_folder_6-ok ..... com.mp4」 '或'set「file_name = V001 - Hello ___- video_folder_6 ---- ok ..... com.mp4」'。我認爲問題是有這麼多的可能性。我不確定這是可能的,但無論如何,它都會使它自己搜索文本。例如就像搜索數組一樣。我認爲批處理不支持數組。謝謝 – Arthor

+1

您的_new_請求已添加到解決方案中,請檢查它。 PS - 通過一系列小的請求(現在這個改變,現在這個改變等等)開發一個程序並不是一個好主意。從一開始就開發一個完整的程序是比較容易的,因爲_modifications_更難寫......':(' – Aacini

+0

首先,謝謝你,我要測試它。 ,我有其他堆棧成員告訴我,要求一個完整的解決方案是一個壞主意,因爲它有很多部分,我真的很感謝這項艱苦的工作,我的謙虛謝謝+1,如果可以,我會更多。 – Arthor

0

使用變量%file_name%的文件

Set "file_name=V001-video_folder_6.com.mp4" 

Set "file_name_new=%file_name:~+4%" 
Set "file_name_new=%file_name_new: =%" 
Set "file_name_new=%file_name_new:-=%" 
Set "file_name_new=%file_name_new:video=%" 
Set "file_name_new=%file_name_new:_=%" 
Set "file_name_new=%file_name_new:folder=%" 
Set "file_name_new=%file_name_new:.com=%" 

for /F "tokens=1 delims=-." %%A in ("%file_name_new%") 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% 

如果你想周圍刪除任何東西,我做了這個劇本,但有一個問題它不會刪除號碼。

@setlocal enableextensions enabledelayedexpansion 

Set "file_name=V001-video_folder_4.com.mp4" 
set file_name_new=!file_name:~0,-4! 
Set "file_name_new=%file_name_new:~+4%" 
Set "file_name_new=%file_name_new: =%" 
Set "file_name_new=%file_name_new:A=%" 
Set "file_name_new=%file_name_new:B=%" 
Set "file_name_new=%file_name_new:C=%" 
Set "file_name_new=%file_name_new:D=%" 
Set "file_name_new=%file_name_new:E=%" 
Set "file_name_new=%file_name_new:F=%" 
Set "file_name_new=%file_name_new:G=%" 
Set "file_name_new=%file_name_new:H=%" 
Set "file_name_new=%file_name_new:I=%" 
Set "file_name_new=%file_name_new:J=%" 
Set "file_name_new=%file_name_new:K=%" 
Set "file_name_new=%file_name_new:L=%" 
Set "file_name_new=%file_name_new:M=%" 
Set "file_name_new=%file_name_new:N=%" 
Set "file_name_new=%file_name_new:O=%" 
Set "file_name_new=%file_name_new:P=%" 
Set "file_name_new=%file_name_new:Q=%" 
Set "file_name_new=%file_name_new:R=%" 
Set "file_name_new=%file_name_new:S=%" 
Set "file_name_new=%file_name_new:T=%" 
Set "file_name_new=%file_name_new:U=%" 
Set "file_name_new=%file_name_new:V=%" 
Set "file_name_new=%file_name_new:W=%" 
Set "file_name_new=%file_name_new:X=%" 
Set "file_name_new=%file_name_new:Y=%" 
Set "file_name_new=%file_name_new:Z=%" 
Set "file_name_new=%file_name_new:.=%" 
Set "file_name_new=%file_name_new:_=%" 
Set "file_name_new=%file_name_new:-=%" 


for /F "tokens=1 delims=-." %%A in ("%file_name_new%") 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% 
endlocal 
相關問題