将文件夹路径定义为变量的批处理脚本

Batch-Script defining Folderpath as Variable

我正在尝试编写一个小的批处理脚本,它将修改后的文件导入到特定的 Firefox 配置文件文件夹中。

问题是每个 Firefox 配置文件文件夹都有不同的生成名称 (例如:C:\Users\Username\AppData\Roaming\Mozilla\Firefox\Profiles\ab1c2def.default

由于我想让脚本在多台 PC 上运行,我无法对路径进行硬编码,所以我希望能够读取路径的最后一部分并将其用作变量,这样我就可以将路径更改为要在其中删除和添加文件的所需文件夹。

这是我开始时使用的代码:

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

那我该怎么做呢?

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" 仅当文件夹包含该字符串时才继续。

注:

  • 如果路径是网络路径,则可能需要使用 pushdpopd 而不是 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 路径值的第一个参数应该是路径 到个人资料文件夹。

注意:使用 for /?call /? 获取语法帮助。

:profiledir

这是调用的标签。对标签的调用可以传递参数 方便传递诸如路径之类的东西。参数 收到的格式为 %1%2 ... %9。波浪号即 %~1 删除外部双引号。被叫标签 return 返回给调用者 完成后。

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"

copy/y 参数允许在不确认的情况下覆盖,因此 del 已过时。

注意:使用 copy /? 获取语法帮助。

最后:删除copy命令前面的echo如果满意说明复制命令OK