windows пакетный выход всей строки - PullRequest
0 голосов
/ 28 марта 2020

Хорошо. это самообновляющийся пакетный файл. Я просто упростил задачу из файла большего размера.
это пакетный файл windows (.bat), который после выполнения должен сам открыть и обновить первую строку

SET variableName=D:\Data
setlocal enableextensions enabledelayedexpansion
set /A i=0
for /f "tokens=*" %%f in ('type "%0"^&cd.^>"%0"') do (
  set /A i=!i!+1
  if !i! EQU 1 (
    echo SET variableName=D:\Data2>>%0
  ) else (
    echo %%f>>%0
  )
)
endlocal

, поэтому давайте объясним ситуацию. у меня есть ! i! переменная в строках 5 и 6 . после выполнения этого файла переменная в каждой строке будет заменена номером строки. это очевидно из-за echo %% f >>% 0 , который не мог игнорировать и экранировать переменную. и мой вопрос, как решить эту проблему? еще одна меньшая проблема заключается в том, что приведенный выше код игнорирует пробелы в начале строки (отступы) и создает плоский файл. результат выполнения этого файла:

SET variableName=D:\Data2
setlocal enableextensions enabledelayedexpansion
set /A i=0
for /f "tokens=*" %%f in ('type "%0"^&cd.^>"%0"') do (
set /A i=5+1
if 6 EQU 1 (
echo SET variableName=D:\Data2>>%0
) else (
echo %%f>>%0
)
)
endlocal

Ответы [ 2 ]

0 голосов
/ 28 марта 2020
set "variableName=D:\Data"
setlocal enableextensions enabledelayedexpansion
rem !test! exclaimations, %test% percentages

for /f "skip=1 delims=" %%A in ('
    type "%~f0" ^&
    ^> "%~f0" echo set "variableName=D:\Data2"
') do (
    setlocal disabledelayedexpansion
    >> "%~f0" echo %%A
    endlocal
)
endlocal

Вы можете избежать подсчета, поскольку skip=1 можно использовать для пропуска первой строки. Используйте delims=, чтобы избежать разделения строки. tokens=* игнорирует разделители в начале строки и получает остаток строки, чтобы его можно было пропустить для этой задачи.

Новая первая строка теперь в команде for l oop вместо стирать файл, чтобы очистить Если вы echo больше строк, увеличьте число skip.

Также может потребоваться использовать setlocal disabledelayedexpansion, чтобы восклицательные знаки были сохранены.

Изменение того же файла, который читается риск, хотя я предполагаю, что вы понимаете риск.

0 голосов
/ 28 марта 2020

Остановка раскрытия переменной при выполнении файла так же проста, как отключение отложенного расширения перед строкой, обновляющей файл, и сопряжение его с конечным локальным.

Сохранение форматирования пробела / табуляции достигается включив разделители = в опции For l oop.

Set variableName=D:\Data
Setlocal enableextensions enabledelayedexpansion
Set /A i=0
For /f "tokens=* delims=" %%f in ('type "%0"^&cd.^>"%0"') do (
  Set /A i+=1
  If !i! EQU 1 (
    Echo SET variableName=D:\Data2>>%0
  ) Else (
    Setlocal DisableDelayedExpansion
    Echo(%%f>>%0
    Endlocal
  )
)
Endlocal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...