Есть ли способ извлечь файл TXT и преобразовать его в пакетный файл? - PullRequest
1 голос
/ 01 августа 2020

У меня есть этот код:

 @echo off 
 (for /f "tokens=* delims=:" %%L in ('findstr /b ::: "%~f0"') do echo %%L) >list.bat 
:::@echo off
:::echo hello
:::pause

, и он берет простой сценарий «hello» и превращает его в пакетный файл с именем list.bat . Проблема в том, что мне нужно каждый раз вставлять туда этот код. Однако я хочу извлечь файл с этим кодом внутри, , например , у меня есть list.txt , и я хочу извлечь из него код. То, как я пробовал, ниже, я не знаю, что происходит. Он говорит:

Система не может найти указанный диск

для каждой строки кода внутри list.txt

Когда Я поставил echo перед %% s , он показывает все строки моего кода внутри list.txt .

Что мне не хватает?

@echo off 
(for /f "tokens=* delims=:" %%l in ('findstr /b ::: "%~f0"') do echo %%l) >list.bat 
for /f "tokens=*" %%s in (list.txt) do (
   %%s
)
pause

List.txt выглядит так:

:::@echo off
:::echo hello
:::pause

Файл, который будет создан (list.bat), выглядит так:

@echo off
echo hello
pause

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

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

@echo off
>list.bat (FOR /F delims^=^ eol^= %%L in ('""%__APPDIR__%FINDSTR.EXE" /BN ":::" "List.txt""') do (
    set "line=%%L"
    SETLOCAL EnableDelayedExpansion
    echo(!line:*::::=!
    ENDLOCAL
))

Есть 4 двоеточия ::::, потому что я использовал FINDSTR, который добавляет двоеточие впереди, чтобы убедиться, что строка не является пустой.

Заключение

Не добавляйте двоеточия в свой файл.

0 голосов
/ 02 августа 2020

Как уже упоминалось в комментариях, все, что вы фактически сделали, - это создали копию Input.xtf с именем run.bat, а затем запустили это!

Вот как я интерпретировал ваше собственное code:

  • Input.xtf - пустой файл или его содержимое неизвестно.
  • Output.xtf - каждая непустая строка из Input.xtf, но с добавлением ::::.
  • run.bat - это содержимое Output.xtf, но с удаленным ведущим ::::, что означает, что это то же самое, что Input.xtf
  • compiler.bat - это каждая строка этого скрипта, ( list.cmd), который начинается с ::::, он создает и запускает run.bat, а затем удаляет как Output.xtf, так и себя.

На основе этой оценки предоставленный вами сценарий может с такой же легкостью выглядели следующим образом: (и даже тогда вы не смогли бы прочитать Loading .XTF file please wait!, потому что команда CLS эффективно очистит его, прежде чем вы успеете его прочитать).

@ECHO OFF

IF NOT EXIST "Input.xtf" (
    CD.> "Input.xtf" 2> NUL
    EXIT /B
)

COPY /Y "Input.xtf" "Run.bat" 2> NUL || EXIT /B

CLS
ECHO=
ECHO=
ECHO=
ECHO=
ECHO Loading .XTF file please wait!
ECHO=
ECHO=

CLS
ECHO=
ECHO=
ECHO=
ECHO=
ECHO Done! finalizing loading
ECHO=
ECHO=

START "Run.bat"
EXIT /B

Кроме того, поскольку Input.xtf не может содержать абсолютно ничего, (поскольку вы создали 0-байтовый файл, i если его не было) , возможно, что CD.> "Input.xtf" с последующим CD.> "Run.bat" - это все, что вы сделали! Я предполагаю, что это не то, что вы хотели сделать, поэтому может быть лучше проверить, существует ли Input.xtf и есть ли вместо этого контент. Удалив ненужные строки ECHO, готовый сценарий мог бы выглядеть так:

@IF NOT EXIST "Input.xtf" CD.> "Input.xtf" 2> NUL
@"%__APPDIR__%FIND.EXE" /V "" "Input.xtf" 1> NUL || EXIT /B
@COPY /Y "Input.xtf" "Run.bat" 2> NUL || EXIT /B
@"Run.bat"
0 голосов
/ 01 августа 2020

Проблема решена! Кредиты go Герхарду. Рабочий код приведен ниже:

@(for /f "tokens=* delims=:" %%L in ('type list.txt ^|findstr /b ":::"') do @echo %%L)>list.cmd

Этот код извлекает каждую строку из формы list.txt удаляет двоеточия и делает list.cmd Работал для меня. Мой код ниже:

@echo off
if not exist Run.bat goto start
del Run.bat
goto start
:start
if exist Output.xtf del Output.xtf
if not exist Input.xtf goto makefiles
cls
echo.
echo.
echo.
echo.
echo Loading .XTF file please wait!
echo.
echo.
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (Input.xtf) do (
set /a N+=1
echo ^:::: %%a^ >>Output.xtf
)
cls
echo.
echo.
echo.
echo.
echo Done! finalizing loading
echo.
echo.
if not exist compiler.bat goto makbatchcomplier
if not exist Output.xtf goto makefiles1
call compiler.bat
exit

:makbatchcomplier
(for /f "tokens=* delims=:" %%L in ('findstr /b :::: "%~f0"') do echo %%L) >compiler.bat
:::: @(for /f "tokens=* delims=:" %%L in ('type Output.xtf ^|findstr /b "::::"') do @echo %%L)>Run.bat
:::: start Run.bat
:::: del Output.xtf
:::: del compiler.bat
:::: exit
call compiler.bat
exit
:makefiles
echo >Input.xtf
exit
:makefiles1
echo >Output.xtf
call compiler.bat
exit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...