2017-04-01 112 views
-2

我有一個轉換請求,需要轉換一個txt文件才能顯示BATCH中的特定文件夾。批處理文件txt轉換

所以這裏有一個例子文件:

zpaq v7.15 journaling archiver, compiled Aug 17 2016 
zpaq_m1.zpaq: 1 versions, 14 files, 125 fragments, 4.521800 MB 

- 2017-03-31 21:22:24  9025719 D  c:/2/testdata/ 
- 2016-09-26 13:26:07   9149 A  c:/2/testdata/test.txt 
- 2017-03-31 21:22:48  9014621 D  c:/2/testdata/Subfolder/ 
- 2017-03-31 21:22:59  11856 D  c:/2/testdata/Subfolder/History/ 
- 2017-03-31 21:22:24  11856 D  c:/2/testdata/Subfolder/History/2016-03-12/ 
- 2016-03-11 23:31:49   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h31m49s v1.9.m3p 
- 2016-03-11 23:36:47   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h36m47s v1.9.m3p 
- 2016-03-11 23:37:09   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h37m09s v1.9.m3p 
- 2016-03-11 23:38:34   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h38m34s v1.9.m3p 
- 2016-03-11 23:40:00   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h40m00s v1.9.m3p 
- 2016-03-11 23:40:25   1976 A  c:/2/testdata/Subfolder/History/2016-03-12/00h40m25s v1.9.m3p 
- 2016-03-11 23:39:43  9001472 A  c:/2/testdata/Subfolder/test.exe 
- 2017-03-28 10:45:03   1293 A  c:/2/testdata/Subfolder/test.ini 
- 2016-09-26 14:04:43   1949 A  c:/2/testdata/todo.txt 

9.025719 MB of 9.025719 MB (14 files) shown 
    -> 9.017815 MB (129 refs to 125 of 125 frags) after dedupe 
    -> 4.521800 MB compressed. 

因此,這裏有我想要轉換的文件的步驟:

  1. 刪除前三行
  2. 刪除最後四行
  3. 剪下每行的前41個字母
  4. 將正斜槓替換爲反斜槓
  5. 刪除一切後,最後一個反斜槓(所以文件名)
  6. 鮮明的文件,使每個文件夾都只能有一次

因此,最終的結果應該是:

c:\2\testdata\ 
c:\2\testdata\Subfolder\ 
c:\2\testdata\Subfolder\History\ 
c:\2\testdata\Subfolder\History\2016-03-12\ 

非常感謝您的幫助

這是我目前的狀態:

::delete first 2 lines 
for /f "skip=1 delims=*" %%a in (Listing.txt) do (
echo %%a >>Listing2.txt  
) 

::delete last 3 lines 
@echo off 
setlocal enabledelayedexpansion 
set count= 
for /f %%x in ('type Listing2.txt ^| find /c /v ""') do set /a lines=%%x-3 
copy /y nul %tmp%\tmp.zzz > nul 
for /f "tokens=*" %%x in ('type Listing2.txt ^| find /v ""') do (
    set /a count=count+1 
    if !count! leq %lines% echo %%x>>%tmp%\tmp.zzz 
) 
move /y %tmp%\tmp.zzz Listing2.txt > nul 

::Delete last cr flag at the end of the file 
::@echo off 
setlocal DisableDelayedExpansion 
set "firstLineReady=" 
(
    for /F "eol=$ delims=" %%a in (Listing2.txt) DO (
     if defined firstLineReady (echo() 
     set "firstLineReady=1" 
     <nul set /p "=%%a" 
    ) 
) > Listing_Final.txt 
del Listing2.txt /f /q 

::take everything after line 1 und each line after character41 
for /f "skip=1 usebackq delims=" %%i in ("Listing_Final.txt") do call :ProcessLine "%%i" 
:PROCESSLINE 
set "Zeile=%~1" 
::put everything after 41 
(echo %Zeile:~41%)>>"Listing_Final_Folder_Files_temp.txt" 


del Listing_Final.txt /f /q 


::Remove double entries 
::@ECHO OFF 
SETLOCAL 
:: remove variables starting $ 
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 

FOR /f "delims=" %%a IN (Listing_Final_Folder_Files_temp.txt) DO SET $%%a=Y 
(FOR /F "delims=$=" %%a In ('set $ 2^>Nul') DO ECHO %%a)>Listing_Final_Folder_Files_temp2.txt 

::del Listing_Final_Folder_Files_temp.txt /f /q 

現在我想反斜槓反斜槓轉換,但與此代碼它不工作:

::Replace/to \ 
echo off 
setlocal enabledelayedexpansion 
FOR %%f IN ("Listing_Final.txt") DO (
set old=%%f 
echo !old! 
set new=!old:/=\! 
echo !new!>tesss.txt 
echo.     
) 

的最後一步是在最後\刪除一切,但我沒有發現任何東西。

+3

大..你已經打破它分解成任務。因此,開始研究如何完成任務1.當你明白了這一點後,繼續添加任務2,然後重複,直到完成任務。這不是一個代碼編寫服務,您可以在其中發佈您的要求和選擇語言的詳細列表,並且代碼猴會生成代碼以滿足它們。我們期望您在發佈之前自行尋找解決方案 –

+0

我建議您訪問[ss64.com/nt](http://ss64.com/nt)並仔細查看命令'set ,找/ f,排序,也許如果' – LotPings

+0

是的,你是對的,對不起,我的第一篇文章。這是我目前的狀態: – gitmoit

回答

1

我可以建議你使用完全不同的方法嗎?

  • 而不是刪除前三行和最後四行,您可能只處理以「 - 」開頭的行;這允許用更多或更少的行處理任何文件。
  • 而不是削減每行的第一個41 字符,您可能只處理每行的第6個空格分隔的標記。
  • 而不是刪除最後一個反斜槓後的所有內容,您可能會得到這種令牌的驅動器和路徑。這也自動將任何正斜槓轉換爲反斜槓。
  • 最後,您可以使用下標這樣的值來定義數組元素,因此只保留具有唯一下標的元素,而不是查找和刪除重複元素。

@echo off 
setlocal EnableDelayedExpansion 

rem Processing lines that have a dash in first column, get the sixth token 
for /F "tokens=6" %%a in ('findstr "^-" Listing.txt') do (

    rem Get just the drive and path of sixth token 
    rem at same time, convert Forward slash to Backslash 
    rem and use it as the subscript of an array, 
    rem so just unique elements are stored: 

    set "folder[%%~DPa]=1" 
) 

rem Show the result 
for /F "tokens=2 delims=[]" %%a in ('set folder[') do echo %%a 

輸出:

c:\2\testdata\Subfolder\History\2016-03-12\ 
c:\2\testdata\Subfolder\History\ 
c:\2\testdata\Subfolder\ 
c:\2\testdata\ 
+0

非常感謝Aacini,非常好的想法。它告訴我,變量「folder [」是noch定義的。我需要做什麼? – gitmoit

+0

這就是我所做的:我複製你的示例數據並將其粘貼到名爲'Listing.txt'的文件中;然後,我將批處理代碼複製到放置在數據文件相同文件夾中的'test.bat'文件中。最後,我運行它。我在其他計算機上再次做了同樣的結果。我建議你做_完全相同_... – Aacini