следующий пакет работает хорошо, пока комментарий "следующее не работает должным образом", я пробовал любой вид%; %%,! вокруг переменных, но всегда терпят неудачу, либо не имеют ничего или ошибок!

rem @ECHO OFF
ECHO %~dp0
ECHO %~dpnx0
SET fileNameForWMIC=
SET "7ZAEXE=7za.exe"
SET "SOURCE=C:\Program Files (x86)\my prog\PFM\*.*"
SET "LOCATION=C:\Program Files (x86)\my prog\PFM"
SET "TARGET=PFM.7z"
SET "REFFILE=NEWPFM.7z"
SET "IMPFILE=verPFM.txt"
setlocal enabledelayedexpansion
SET 7ZAEXE=%~dp0!7ZAEXE!
ECHO !7ZAEXE!
SET TARGET=%~dp0!TARGET!
ECHO !TARGET!
SET REFFILE=%~dp0!REFFILE!
ECHO !REFFILE!
SET IMPFILE=%~dp0!IMPFILE!
ECHO !IMPFILE!
rem "!7ZAEXE!" a "!TARGET!" @"!IMPFILE!" 
rem the whole directory
rem for /D %%X in ("!SOURCE!") do  !7ZAEXE! a "!TARGET!" "%%X"
rem only the important files listed in text file
FOR /F "usebackq skip=1 tokens=1,2 delims=," %%G IN ("%IMPFILE%") DO ( 
  echo %%G version %%H
  SET fileNameForWMIC=%%G 
  SET GoodVer=%%H
  SET "fileNameForWMIC=!fileNameForWMIC:\=\\!"
  ECHO !fileNameForWMIC!
  ECHO Goodver !GoodVer!
  rem the following do not perform as expected
  setlocal enabledelayedexpansion
  FOR /F "usebackq skip=1" %%I IN (`wmic datafile where Name^="!fileNameForWMIC!" get Version ^| findstr /r /v "^$"`) DO (
    SET "filever1=%%~I"
    ECHO( !filever1!
  )
  IF /I NOT ["!filever1!"] == ["%GoodVer%"] (
    ECHO "%fileNameForWMIC%" have version^=!filever1! instead of %GoodVer%
    "!7ZAEXE!" a "!TARGET!" "%fileNameForWMIC%"
    SET /A NbError+=1  
  ) ELSE ( "!7ZAEXE!" e "!REFFILE!" -o!LOCATION! "%fileNameForWMIC%" -r)
)  

вот несколько строк verPFM.txt

Name                                               Version
c:\program files (x86)\my prog\pfm\intl.dll,0.18.1.0
c:\program files (x86)\my prog\pfm\libeay32.dll,1.0.1.16
c:\program files (x86)\my prog\pfm\libl1sa.dll,1.2.0.1

Сначала он правильно читает имя файла и версию, расположенную в файле verpfm.txt, но второй For/F не может получить переменную fileNameForWMIC, поэтому восстановление не может быть завершено.

Пакетный файл находится в каталоге, куда я помещаю также 7za.exe для сжатия и файл verPFM.txt.

NewPFM.7z содержит файл, указанный в файле verPFM.txt, целью пакета является проверка того, что все файлы, перечисленные в файле verPFM.txt и расположенные в "LOCATION", имеют ту же версию, что и в списке, если не совпадают с файлом в LOCATION в архив PFM.7z и замените его на тот, что в NewPFM.7z

Я надеюсь построить окончательный пакет с обратной опцией, чтобы восстановить файл, сохраненный в PFM.7z

Как это исправить ?? 1000 заранее спасибо

1 ответ1

0

Наконец, после многих попыток, я получил эту партию, используя процедуру.

Работает как положено

@ECHO OFF
ECHO %~dp0
ECHO %~dpnx0
SET fileNameForWMIC=
SET "ZAEXE=7za.exe"
SET ZAEXE=%~dp0%ZAEXE%
IF NOT EXIST %ZAEXE% (
 ECHO 7za.exe is missing please fix it and restart
 GOTO :END
 )
SET DEST="C:\Program Files (x86)\My Prog\PFM"
IF /I "%1"=="/revert" GOTO :REVERT
SET "IMPFILE=verPFM.txt"
SET IMPFILE=%~dp0%IMPFILE%
IF NOT EXIST %IMPFILE% (
  ECHO verPFM.txt is missing please fix it and restart
  GOTO :END
  )
SET "REFFILE=refPFM.7z"
SET REFFILE=%~dp0%REFFILE%
IF NOT EXIST %REFFILE% (
  ECHO refPFM.7z is missing please fix it and restart
  GOTO :END
  )
SET "SOURCE=C:\Program Files (x86)\My Prog\*.*"
SET "TARGET=PFM_ALL.7z"
SET TARGET=%~dp0%TARGET%
rem the whole directory
FOR /D %%X IN ("%SOURCE%") do  %ZAEXE% a "%TARGET%" "%%X"
IF NOT EXIST %TARGET% (
  ECHO PFM_ALL.7z was not created please report
  GOTO :END
  ) ELSE ECHO A complete backup of %SOURCE% is in %TARGET%
  rem change target file
  SET "TARGET=PFM.7z"
  SET TARGET=%~dp0%TARGET%
  SET /A NbError=0
  rem "!7ZAEXE!" a "!TARGET!" @"!IMPFILE!" 
  rem only the important files listed in text file
  setlocal enabledelayedexpansion
  FOR /F "usebackq skip=1 tokens=1,2 delims=," %%G IN ("%IMPFILE%") DO ( 
    rem echo %%G version %%H
    SET fileNameForWMIC=%%G 
    SET GoodVer=%%H
    SET "fileNameForWMIC=!fileNameForWMIC:\=\\!"
    rem ECHO !fileNameForWMIC!
    rem ECHO Goodver !GoodVer!
    call :process "%%G" %%H
    )
  goto :next  
:next
IF %NbError% EQU 0 (
  ECHO All files was already upto date
  GOTO :END
  ) ELSE ( 
    IF NOT EXIST %TARGET% (
      ECHO PFM.7z was not created please report
      GOTO :END
      ) ELSE ( ECHO %NbError% files saved in %TARGET% )
  )   
:END
  SET SOURCE=
  SET TARGET=
  SET fileNameForWMIC=
  SET fileNameForW=
  SET GoodV=
  SET GoodVer=
  SET NbError=
  SET REFFILE=
  SET DEST=
  SET filename=
  EXIT /B 
:process
  SET fileNameForW=%1 
  rem ECHO %fileNameForW%
  SET GoodV=%2
  SET fileNameForW=%fileNameForW:\=\\%
  rem ECHO %fileNameForW%
  rem ECHO Goodv %GoodV%
  SET fileNameForWW=%1 
  rem ECHO %fileNameForWW%
  FOR /F "usebackq skip=1" %%I IN (`wmic datafile where Name^=%fileNameForW% get Version ^| findstr /r /v "^$"`) DO (
  SET "filever1=%%~I"
  rem ECHO( !filever1!
  )
  IF /I NOT ["!filever1!"] == ["%GoodV%"] (
    ECHO %fileNameForW% have version^=%filever1% instead of %GoodV%
    "%ZAEXE%" a "%TARGET%" %fileNameForWW%
    SET /A NbError+=1  
    rem ECHO %fileNameForWW%
    call :getfilename %fileNameForWW%
    "%ZAEXE%" e "%REFFILE%" -o%DEST% !filename! -aoa
    GOTO :EOF
    ) ELSE ( 
    GOTO :EOF
    )
 :getfilename
  SET filename=%~nx1
  rem echo The name of the file is %filename%
  rem set folder=%~dp1
  rem echo It's path is %folder%
  GOTO :EOF
:REVERT
  rem change target file
  SET "TARGET=PFM.7z"
  SET TARGET=%~dp0%TARGET%
  IF NOT EXIST %TARGET% (
   ECHO PFM.7z not found could not revert
   GOTO :END
   ) ELSE (
    "%ZAEXE%" e "%TARGET%" -o%DEST% * -aoa
    GOTO :END
    )

процедура: КОНЕЦ закончите партию, сначала очистив переменную

процедура:REVERT отменить внесенные изменения, это связано с вызовом batch.cmd /revert

IMPFILE создается с использованием той же команды wmic, которая используется для получения версии файла, с помощью параметра /OUTPUT, затем файл редактируется для удаления пустого символа и преобразуется из UTF16 в ASCII (с использованием notepad++), если не файл не может быть прочитанным!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .