Пакетный скрипт, определяющий путь к папке как переменную - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать небольшой пакетный скрипт, который импортирует измененный файл в определенную папку профиля Firefox.

Проблема в том, что каждая папка профиля Firefox имеет сгенерированное имя (например: C:\Users\Username\AppData\Roaming\Mozilla\Firefox\Profiles\ab1c2def.default)

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

Вот код, с которого я начал:

REM turning echo off
@echo off

REM changing directory to \Profiles Folder, behind it is the variable Folder.
cd %appdata%\Mozilla\Firefox\Profiles

REM I wanna read the last Folder into a variable.
set userprofilefolder = Somehow read the folders behind \Profiles

REM now I wanna change my directory into that one folder.
cd %appdata%\Mozilla\Firefox\Profiles\%userprofilefolder%

REM Here I am deleting the old "prefs.js" file in the Folder.
del prefs.js

REM now I change my Folderpath to where my modified "prefs.js" file lays.
cd path\where\my\prefs.js\file\lies

REM now I copy my fresh prefs.js" file into my Folder.
copy "prefs.js" "%appdata%\Mozilla\Firefox\Profiles\%userprofilefolder%"

REM Here I exit my .bat file.
exit

Так как мне это сделать?

1 Ответ

0 голосов
/ 03 мая 2018
REM Turn echo off.
@echo off

REM Change directory to Firefox folder, this is where the profiles.ini file exist.
cd /d "%appdata%\Mozilla\Firefox" || exit /b 1

REM Read profiles.ini and call :profiledir with the value of each path key found.
for /f "tokens=1* delims==" %%A in (profiles.ini) do (
    if /i "%%~A" == "path" call :profiledir "%%~B"
)
exit /b

:profiledir

REM Set local environment. Any settings i.e cd will be temporary.
setlocal

REM Check if ".default" in path to continue.
echo "%~1"| find ".default" || exit /b 1

REM Change to the profile dir.
cd /d "%~1" || exit /b 1

REM Copy prefs.js to current dir.
echo copy /y "path\to\my\prefs.js" "prefs.js"
exit /b

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

У вас может быть много папок профиля, поэтому я использую find ".default" продолжить, только если папка содержит эту строку.

Примечание:

  • Если пути являются сетевыми путями, возможно, потребуется использовать pushd и popd вместо cd.

Описание операции

REM Change directory to Firefox folder, this is where the profiles.ini file exist.
cd /d "%appdata%\Mozilla\Firefox" || exit /b 1

Это меняет текущий каталог. || - команда запуска с правой стороны если команда слева не удалась. В случае неудачи выйдет с уровнем ошибки 1.

Примечание. Используйте cd /? и exit /? для справки по синтаксису.

REM Read profiles.ini and call :profiledir with the value of each path key found.
for /f "tokens=1* delims==" %%A in (profiles.ini) do (
    if /i "%%~A" == "path" call :profiledir "%%~B"
)

Этот цикл for читает файл profiles.ini. Набор разделителей =, который INI-файл используется для отделения ключа от значения. Токен 1 будет ключ помещается в %%A, а токен * будет значением, сохраненным в %%B. Если ключ равен ключу с именем path, вызовите метку с именем :profiledir с 1-м аргументом значения пути, который должен быть путем в папку профиля.

Примечание. Используйте for /? и call /? для справки по синтаксису.

:profiledir

Это названный ярлык. Вызов метки может передавать аргументы, которые делает его удобным для прохождения чего-то вроде пути. аргументы принимаются в формате %1, %2 ... %9. Тильда т. Е. %~1 удаляет внешние двойные кавычки. Вызываемые метки возвращаются обратно к абоненту когда закончите.

REM Check if ".default" in path to continue.
echo "%~1"| find ".default" || exit /b 1

"%~1" - первый цитируемый аргумент. Это отражено в команде find и если .default найдено, затем будет продолжено. | известен как труба, где стандартный вывод echo передается стандартному find.

Примечание: используйте find /? для справки по синтаксису.

REM Change to the profile dir.
cd /d "%~1" || exit /b 1

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

REM Copy prefs.js to current dir.
echo copy /y "path\to\my\prefs.js" "prefs.js"

Аргумент /y copy позволяет перезаписывать без подтверждения, поэтому del устарел.

Примечание. Используйте copy /? для справки по синтаксису.

Наконец: удалите echo перед командой copy, если убедитесь, что она показывает, что команда копирования в порядке.

...