Убрать возврат каретки из переменной окружения - командная строка XP - PullRequest
3 голосов
/ 26 июня 2011

В пакетном файле Windows XP я собираю список каталогов FTP и обрабатываю его с помощью цикла For /F.Последний токен, содержащий имя файла, заканчивается возвратом каретки (0D) в качестве последнего символа в переменной.После получения моя попытка использовать значение в токене не удалась, потому что при возврате каретки мой оператор If переносится в начало строки.

@echo off
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
   if 'Stuff.zip'=='%%B' Set StuffDate=%%A
   )
echo Stuff.zip was saved on %StuffDate%.

Содержимое, подлежащее обработке, выглядит следующим образом:

ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
01-04-10  10:00AM                93882 Logo.jpg
02-05-10  11:01PM       <DIR>          PCODE
03-06-10  12:02PM             42333443 Saved stuff.zip
04-07-10  12:42PM             49343848 Stuff.zip
226 Transfer complete.

После проверки в шестнадцатеричном редакторе каждая строка заканчивается 0D 0D 0A, а не просто 0D 0A.Я не уверен, почему есть дополнительный 0D, но мне нужно удалить его, чтобы моя программа работала.

Во время выполнения, когда %% B равен Stuff.zip, If должен выглядеть следующим образом:

( if 'Stuff.zip'=='Stuff.zip' Set ReleaseDate=04-07-10 ) 

Строка If в конечном итоге выглядит следующим образом из-за CR:

' Set ReleaseDate=04-07-10 )  'Stuff.zip

( if 'Stuff.zip'=='Stuff.zip перезаписывается при обработке возврата каретки 0D.

Как избавиться от лишних 0D в конце переменной окружения?

1 Ответ

2 голосов
/ 27 июня 2011

Даже если ваша строка кода выглядит любопытно, она работает нормально.
Но в вашем случае есть несколько способов удалить <CR>.

Первый и самый простой способ - используйте пакетный анализатор, так как он удаляет все символы <CR> после фазы расширения процента и перед фазой специальных символов.

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
   set "fileName=%%B"
   call :removeCR
   if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
   )
echo Stuff.zip was saved on %StuffDate%.
goto :eof

:removeCR
set "fileName=%fileName%"
goto :eof

Но в целом это решение может вызвать некоторые проблемы со специальными символами, такими как восклицательные знаки и т. Д.

Другой способ - заменить <CR> пустой строкой.

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
   set "fileName=%%B"
   call :removeCR
   if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
   )
echo Stuff.zip was saved on %StuffDate%.

:removeCR
set "fileName=%fileName:<CR>=%"
goto :eof

<CR> в строке set "fileName=%fileName:<CR>=%" необходимо изменить на 0x0D с шестнадцатеричнымредактор.Но у этого решения есть те же проблемы специальных символов, что и у первого решения, и вы не можете создать его с помощью обычного текстового редактора.

Последнее решение создает один <CR> и использует его в функции :removeCR с отложенным расширением.
Это решение безопасно для всех специальных символов, кроме восклицательных знаков.

@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
   set "fileName=%%B"
   call :removeCR
   if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
   )
echo Stuff.zip was saved on %StuffDate%.

:removeCR
for %%a in ("!CR!") do (
    set "fileName=!fileName:%%~a=!"
)
goto :eof
...