Удалите конечные пробелы в файле для сравнения, используя пакетный скрипт - PullRequest
1 голос
/ 22 марта 2012

Я создал пакетный файл, который запускает некоторый SQL и записывает выходные данные в файл.

Теперь я пытаюсь сравнить эти данные результата, чтобы переместить некоторые файлы, но в выходном файле SQL, похоже, есть конечные пробелыв результате неправильное сравнение.

Как я могу удалить эти конечные пробелы?

FOR /F "delims=" %%R IN (C:\Test01.txt) DO IF Ready == %%R COPY /y C:\Test01.txt "

Test01 выглядит как

Returncode
-----------
No
Yes
Complete
Incomplete
Ready              

Я вижу конечные пробелы и сравнение его с Готовым всегда приводит к нет

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Расширение переменной FOR имеет модификаторы, которые обрабатывают значение как спецификацию файла и разбивают его на компоненты

  • %% ~ dR = диск:
  • %% ~ pR = \ path \
  • %% ~ nR = baseName
  • %% ~ xR = .extension

Эти модификаторы также нормализуют значение в канонической (стандартной) форме.

Windows не позволяет имени файла или папки заканчиваться пробелом или точкой, поэтому модификаторы будут обрезать конечные точки и пробелы из значения. Вы можете использовать этот факт, чтобы обрезать завершающие пробелы!

FOR /F "delims=" %%R IN (C:\Test01.txt) DO IF Ready == %%~nxR COPY /y C:\Test01.txt

Это будет работать правильно, только если значение не содержит : \ или /. Также помните, что это также урежет конечные точки. Таким образом, строка типа c:\my path\Ready. также станет Ready, если вы используете %%~nxR.

Существует еще более простое и надежное решение, которое может работать в вашем случае. Все ваши строки состоят из одного слова (плюс завершающие пробелы). Если вы можете положиться на этот факт, то можете просто удалить опцию DELIMS и позволить FOR обрезать пробелы для вас (по умолчанию DELIMS - это пробел и табуляция).

FOR /F %%R in (C:\Test01.txt) DO IF Ready == %%R COPY /y C:\Test01.txt

Если вы беспокоитесь, что какое-то слово может следовать за READY, и в этом случае вы не хотите копировать, тогда вы можете использовать

FOR /F %%R* in (C:\Test01.txt) DO IF Ready == %%R IF "%%S" == "" COPY /y C:\Test01.txt
1 голос
/ 22 марта 2012

Вы можете использовать пакетную обработку строк, чтобы вырезать первые пять букв (то есть длину строки "Ready") из строки.

Это требует enabledelayedexpansion ( см. Документы ) и работает так:

setlocal enabledelayedexpansion

for /f "delims=" %%R IN (Test01.txt) do (
  set str=%%R
  if "!str:~0,5!" == "Ready" copy /y Test01.txt "somewhere"
)

См. Больше советов по работе со строками - включая способ обрезки пробелов - здесь: http://www.dostips.com/DtTipsStringManipulation.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...