Пакетный файл Windows FOR / F Loop - как получить всю строку при использовании токенов и разделителей? - PullRequest
1 голос
/ 03 марта 2011

Здравствуйте, дорогие коллеги ...

У меня следующая проблема.Мне нужно изменить одно значение в текстовом файле pref.js (принадлежит FireFox)

Если этот файл содержит строку:

user_pref("network.proxy.type", 1);

, я должен изменить его на:

user_pref("network.proxy.type", 0);

Единственный способ, который, кажется, работает (в пакетном файле), это скопировать этот файл в новую "строку за строкой", и если я найду строку "network.proxy.type", я не копирую ее, а вместо этогоЯ записываю в новый файл нужную строку.

Я делаю это так:

cls
@echo off
set searchedString=user_pref("network.proxy.type"
set replaceSearchedWith=user_pref("network.proxy.type",0^^);

for /F "tokens=1,* delims=," %%j in (FileIn.txt) do (
  if %%j==%searchedString% ( 
    echo %replaceSearchedWith% >> FileOut.txt

  )
  if not %%j==%searchedString% ( 
    echo %%j,%%k >> FileOut.txt
  ) 
)

Это работает почти хорошо.Единственная проблема заключается в том, что исходный файл выглядит так:

# Mozilla User Preferences

/* Do not edit this file.
 *
 * If you make changes to this file while the application is running,
 * the changes will be overwritten when the application exits.
 *
 * To make a manual change to preferences, you can visit the URL about:config
 * For more information, see http://www.mozilla.org/unix/customizing.html#prefs
 */

user_pref("accessibility.typeaheadfind.flashBar", 0);
user_pref("app.update.enabled", false);
...

Как видите, в начале этого файла есть комментарии.И мой алгоритм добавляет запятую (,) в конец последней строки комментария.Затем это выглядит так:

# Mozilla User Preferences, 
/* Do not edit this file., 
 *, 
 * If you make changes to this file while the application is running, 
 * the changes will be overwritten when the application exits., 
 *, 
 * To make a manual change to preferences, you can visit the URL about:config 
 * For more information, see http://www.mozilla.org/unix/customizing.html#prefs 
 */, 
user_pref("accessibility.typeaheadfind.flashBar", 0); 
user_pref("app.update.enabled", false); 
...

Это потому, что моя программа объединяет токены следующим образом:

echo %%j,%%k >> FileOut.txt

А теперь последний вопрос

Есть ли способ, как получить всю текстовую строку в моем цикле for, чтобы мне не приходилось объединять строки?

Или есть лучший способ выполнить свою работу?

Я думаю, что я мог бы пропустить первые 12 строк, но я не уверен, что на каждом компьютере этот комментарий будет занимать ровно 12 строк.Этот скрипт следует использовать на сотнях компьютеров в нашей сети.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 03 марта 2011

@ Гравитация поддержана. Perl портативный. Зачем использовать что-то еще? В любом случае, просто чтобы удовлетворить ваши мазохистские тенденции:

for /F "tokens=*" %%j in (FileIn.txt) do call :testformatch %%j& if errorlevel 1 (echo %%j >>FileOut.txt) else echo need something else >>FileOut.txt
goto :eof

:testformatch
echo %*| find "network.proxy.type" >nul
goto :eof

Тьфу, заставляет мою плоть ползать!

0 голосов
/ 03 марта 2011

Вы можете просто проверить, является ли %% k пустой строкой, перед тем как повторить вывод:

...
  if not %%j==%searchedString% (
    if "%%k"=="" (
      echo %%j>> FileOut.txt
    ) else (
      echo %%j,%%k>> FileOut.txt
    )
  ) 
...

Кстати, вместо того, чтобы сравнивать с %searchedString% дважды, вы могли бы сделать это только один раз, используя одну if (...) else (...) структуру. Здесь:

@echo off
set searchedString=user_pref("network.proxy.type"
set replaceSearchedWith=user_pref("network.proxy.type",0^^);

for /F "tokens=1,* delims=," %%j in (FileIn.txt) do (
  if %%j==%searchedString% ( 
    echo %replaceSearchedWith% >> FileOut.txt
  ) else ( 
    if "%%k"=="" (
      echo %%j>> FileOut.txt
    ) else (
      echo %%j,%%k>> FileOut.txt
    )
  ) 
)
0 голосов
/ 03 марта 2011

Прежде всего, не используйте для этого сценарии cmd. Вычисление π с использованием только целых чисел - это одно, но попытка разобрать код JavaScript (даже сгенерированный компьютером) - это путь к безумию (не говоря уже о том, что он очень медленный).


Во-вторых, хулиганство с пользователем prefs.js - это не правильный путь.

Вы можете настроить распределенную конфигурацию в программном обеспечении Mozilla, как описано в Mission Control .

  1. Создание <programdir>\defaults\pref\all.js с содержанием:

    pref("general.config.obscure_value", 0);
    pref("general.config.filename", "firefox-config.js");
    
  2. Создание <programdir>\firefox-config.js с содержанием:

    lockPref("autoadmin.global_config_url", "https://configserver/firefox-config.js");
    
  3. На configserver создайте firefox-config.js и убедитесь, что он доступен по указанному выше URL.

    pref("network.proxy.type", 0);
    

    Если вы хотите принудительно установить тип проксииспользуйте взамен lockPref().(Однако это можно переопределить.)

Вы можете пропустить шаг 3 и просто использовать network.proxy.type на шаге 2, но вы бы предпочли обновить сотни настроекфайлы один раз или каждый раз ?

Кроме того, было бы проще настроить Firefox на использование системных настроек прокси (network.proxy.type=5),IE и Chrome делают то же самое.


Если вы хотите придерживаться своих методов, рассмотрите другой язык программирования.Perl, Python, JScript или C # лучше, чем cmd.

JScript и VBScript поставляются с Windows.Для C # и VB.NET в наши дни большинство Windows Boxen имеют установленную среду выполнения .NET.

...