Выход из пробела в строковой переменной - PullRequest
0 голосов
/ 05 февраля 2019
@echo off
setlocal enableextensions enabledelayedexpansion

set CHECKSUM_TOOL=fciv.exe
set DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder
set CHECKSUM=12345
set APP_NAME=price
set VERIFY_FILE=testfile.txt

for /f "tokens=1" %%m in ('call "%CHECKSUM_TOOL%" -md5 
"%DESTINATION_DIR%\!VERIFY_FILE!"') do (
      for /f "tokens=1 delims=/ " %%n in ("%%m") do (
        set CURRENT_CHECKSUM="%%n"
        if not !CURRENT_CHECKSUM!==!CHECKSUM! (
          echo %DATE% %TIME% [ERROR] %~nx0: Checksum of existing file !CURRENT_CHECKSUM! does not match manifest !CHECKSUM! for %APP_NAME%
          REM exit 1
        )
      )
    )

Итак, у меня есть вышеуказанный пакетный скрипт.Проблема в том, что когда я распечатываю значение CURRENT_CHECKSUM, каталог файлов обрезается, и вместо эхо-запроса

C:\Documents and Settings\Users\Desktop\testfolder\testfile.txt

вместо этого я получаю

c:\documents

вывод в вызов fciv, возвращает

bd4e8c3e9b3a880365619e48a779e8e0 c:\documents and settings\Users\desktop\testfolder\testfile.txt 

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Для этого есть несколько решений, но я покажу вам наиболее общее, которое работает, если вы действительно хотите удалить первый токен:

@echo off
setlocal EnableDelayedExpansion

set "CHECKSUM_TOOL=fciv.exe"
set "DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder
set "CHECKSUM=12345"
set "APP_NAME=price"
set "VERIFY_FILE=testfile.txt"

rem Loop to get the first token for substraction later:
for /F "delims=" %%A IN ('call "%CHECKSUM_TOOL%" -md5 "%DESTINATION_DIR%\%VERIFY_FILE%"') do (
    set "output=%%A"
    for /F "tokens=1" %%B IN ("%%A") do (
        set "token_to_substract=%%B"
    )
)
set "expected_output=!output:%token_to_substract% =!"

echo The string you wanted to obtain for a custom reason of yours is: %expected_output%

Более короткое, но не очень общее решение, будет:

@echo off

set "CHECKSUM_TOOL=fciv.exe"
set "DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder
set "CHECKSUM=12345"
set "APP_NAME=price"
set "VERIFY_FILE=testfile.txt"

for /F "tokens=2 delims=:" %%A IN ('call "%CHECKSUM_TOOL%" -md5 "%DESTINATION_DIR%\%VERIFY_FILE%"') do (
    set "expected_output=c:%%A"
)
echo The string you wanted to obtain for a custom reason of yours is: %expected_output%

Также возможно заменить последний цикл for /F на следующий и с тем же значением:

for /F "tokens=2 delims=\" %%A IN ('call "%CHECKSUM_TOOL%" -md5 "%DESTINATION_DIR%\%VERIFY_FILE%"') do (
    set "expected_output=c:\%%A"
)
echo The string you wanted to obtain for a custom reason of yours is: %expected_output%

, который делает то же самое(разница с предыдущим составляет 1 байт :)).

0 голосов
/ 05 февраля 2019

На самом деле я не могу воспроизвести вывод, который вы описали, потому что я получаю (цитируемую) контрольную сумму файла при отображении !CURRENT_CHECKSUM!, но не частичный путь к файлу, как вы описываете.

В любом случае, я вам верюнеправильно определили параметры for /F;вам нужно что-то вроде tokens=1*, так что вы получите два токена, которые разделены первым (последовательностью) пробелов, а второй токен может даже содержать пробелы самостоятельно.Между прочим, нет необходимости использовать два for /F цикла, достаточно одного.

Итак, я предлагаю фиксированный код:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "CHECKSUM_TOOL=fciv.exe"
set "DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder"
set "CHECKSUM=12345"
set "APP_NAME=price"
set "VERIFY_FILE=testfile.txt"

for /F "tokens=1*" %%M in ('
    "%CHECKSUM_TOOL%" -md5 "%DESTINATION_DIR%\%VERIFY_FILE%"
') do if not "%%M"=="%CHECKSUM%" (
    echo !DATE! !TIME! [ERROR] %~nx0: Checksum %%M of existing file %%N does not match manifest %CHECKSUM% for %APP_NAME%
    rem exit /B 1
)

endlocal
exit /B

Это то, что я сделал:

  • один цикл for /F с соответствующими параметрами;
  • использовал синтаксис в кавычках set (кавычки защищают специальные символы, но не являются частью значений);
  • процитировал оба выражения сравнения, чтобы избежать проблем, если они пусты;
  • применил отложенное расширение также для !DATE! и !TIME!;
  • удалил промежуточные переменные и использовал for /F переменные немедленно;
  • заменены (закомментированы) exit на exit /B для выхода из пакетного файла, но не родительский экземпляр cmd;
  • удалено call для запуска fciv.exe поскольку это не командный файл, а исполняемый файл;
0 голосов
/ 05 февраля 2019

Попробуйте установить с помощью "":

set DESTINATION_DIR="C:\Documents and Settings\Users\Desktop\testfolder"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...