2014-09-29 2 views
0

Я надеюсь, что вы сможете помочь и объяснить, в чем проблема. Как и большинство проблем, я уверен, что это будет очень просто для тех, кто регулярно использует Batch Scripts.Batch File file output, string manipulation

Задача, которую я пытаюсь решить, состоит в том, чтобы взять список файлов XML из папки, передать их в Sha1 exe, получить выход, изменить его, объединить результат и затем, наконец, вывести результат в файл , Я надеялся, что мне не нужно выводить на два файла, но я не могу получить выход Sha1 для переменной, чтобы манипулировать им.

В чем проблема? В настоящее время, когда вывод текста возвращается, он выглядит как «size = size: 3», и когда я пытаюсь манипулировать строкой, она беспорядочна с выходом. Пример ниже.

Кодекс:

set "xmlfilelocation=C:\Users\ADMIN\Documents\test" 
set "manifestfile=C:\Users\ADMIN\Documents\manifest.txt" 
set "Sha1=C:\Users\ADMIN\\sha1.exe" 
set "sha1output=C:\Users\ADMIN\Documents\sha1output.txt" 

) 
if exist %xmlfilelocation% (
    for /f %%f in ('dir /b %xmlfilelocation%') do (

     rem Takes the file name which is currently been passed to the Sha1 engine 
     set filename = %%f 

     rem Run the Sha1 command 
     C:\Users\IBM_ADMIN\Documents\Sha1.exe -r %xmlfilelocation%\%%f >> %sha1output% 

     rem Waits _for the current Sha1 execution to be run. 
     PING 1.1.1.1 -n 1 -w 1000 >NUL 
    ) 
) else (
    echo No folder found 
) 

::read %THECSVFILE% and loop through each line 
for /F "usebackq tokens=* delims= " %%A in (%sha1output%) do (
    set the_line=%%A 
    call :process_line 
) 
goto TheEnd 

:process_line 
for /F "usebackq tokens=1,2,3,4,5 delims= " %%1 in ('%the_line%') do (
    set OUTPUTLINE=name=%%2 sha1=%%3 size=%%4 url=%xmlfilelocation%\%%2 
    echo %OUTPUTLINE% >> %manifestfile% 
) 

rem del = %sha1output% 

Перед манипуляций со строками, файл отображается правильно отдельно от sha1 = sha1: который следует читать только sha1 = и размер = размер: должен читать только размер = которого манипуляция должна решить.

name=New6.xml sha1=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size=size:0 url=C:\Users\IBM_ADMIN\Documents\test\New6.xml 
name=New1.xml sha1=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size=size:0 url=C:\Users\IBM_ADMIN\Documents\test\New1.xml 
name=New2.xml sha1=sha1:f10e2821bbbea527ea02200352313bc059445190 size=size:3 url=C:\Users\IBM_ADMIN\Documents\test\New2.xml 
name=New3.xml sha1=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size=size:0 url=C:\Users\IBM_ADMIN\Documents\test\New3.xml 
name=New4.xml sha1=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size=size:0 url=C:\Users\IBM_ADMIN\Documents\test\New4.xml 
name=New5.xml sha1=sha1:f10e2821bbbea527ea02200352313bc059445190 size=size:3 url=C:\Users\IBM_ADMIN\Documents\test\New5.xml 

Когда я добавляю в дополнительных линий, чтобы манипулировать строку:

:process_line 
for /F "usebackq tokens=1,2,3,4,5 delims= " %%1 in ('%the_line:,=~%') do (
    set sha1=%%3 
    set size=%%4 
    set url=%xmlfilelocation%\%%2 
    set THISLINE=name=%%2 sha1=%sha1:~5% size=%size:~5% url=%url% 
    rem echo The Line: %OUTPUTLINE% 
    echo %OUTPUTLINE% >> %manifestfile% 
) 

Возвращает файл, в котором имя выходного не отображается должным образом. Обычно первый или последний файл, значение Sha1, по какой-либо причине выводится как каталог. Это происходит только после того, как я попытаюсь манипулировать строкой.

name=New6.xml sha1=f10e2821bbbea527ea02200352313bc059445190 size=3 url=C:\Users\IBM_ADMIN\Documents\test\New5.xml 
name=New1.xml sha1=ers\IBM_ADMIN\\sha1.exe size=0 url=C:\Users\IBM_ADMIN\Documents\test\New6.xml 
name=New2.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\IBM_ADMIN\Documents\test\New1.xml 
name=New3.xml sha1=f10e2821bbbea527ea02200352313bc059445190 size=3 url=C:\Users\IBM_ADMIN\Documents\test\New2.xml 
name=New4.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\IBM_ADMIN\Documents\test\New3.xml 
name=New5.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\IBM_ADMIN\Documents\test\New4.xml 

Пример вывода SHA1, это то, что выходы Sha1.exe без каких-либо манипуляций со мной.

prefetch New1.xml sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size:0 http://EXAMPLEURL/REPLACEME.exe 
prefetch New2.xml sha1:f10e2821bbbea527ea02200352313bc059445190 size:3 http://EXAMPLEURL/REPLACEME.exe  
prefetch New3.xml sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size:0 http://EXAMPLEURL/REPLACEME.exe  
prefetch New4.xml sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size:0 http://EXAMPLEURL/REPLACEME.exe  
prefetch New5.xml sha1:f10e2821bbbea527ea02200352313bc059445190 size:3 http://EXAMPLEURL/REPLACEME.exe  
prefetch New6.xml sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709 size:0 http://EXAMPLEURL/REPLACEME.exe 

Что конечный результат должен выглядеть для 6 файлов:

name=New6.xml sha1=f10e2821bbbea527ea02200352313bc059445190 size=3 url=C:\Users\ADMIN\Documents\test\New5.xml 
    name=New1.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\ADMIN\Documents\test\New6.xml 
    name=New2.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\ADMIN\Documents\test\New1.xml 
    name=New3.xml sha1=f10e2821bbbea527ea02200352313bc059445190 size=3 url=C:\Users\ADMIN\Documents\test\New2.xml 
    name=New4.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\ADMIN\Documents\test\New3.xml 
    name=New5.xml sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 size=0 url=C:\Users\ADMIN\Documents\test\New4.xml 
+0

Уточнить, что вам нужно выходной текст выглядеть, учитывая выход Sha1. – foxidrive

+0

Да, конечно, как вы можете видеть сверху, большинство из них верны, только в первом примере имя неверно, а второе значение Sha1 - путь к каталогу. Должно быть, name = file.xml sha1 = sha1value size = number URL = путь к файлу – QuinsUK

+0

Вы показали 'Before the string manipulation' и' Пример вывода Sha1 ', и они не совпадают. Неясно, что такое вход и нужный результат, поскольку для получения результата можно использовать другой скрипт/инструмент. – foxidrive

ответ

0

Это делает то, что вы показали:

Это использует вспомогательный командный файл repl.bat (по dbenham) - скачать с: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Место repl.bat в той же папке, что и командный файл, или в папке, находящейся на пути.

Входной файл file.txt и выходной файл newfile.txt

@echo off 
type "file.txt" | repl "prefetch (.*?) sha1:(.*?) size:(.).*" "name=$1 sha1=$2 size=$3 url=C:\Users\IBM_ADMIN\Documents\test\$1" >"newfile.txt" 
pause 
+0

Спасибо, это решило то, что я хотел сделать. – QuinsUK