我正在尝试编写一个小的批处理脚本,它将修改后的文件导入特定的Firefox配置文件文件夹。
问题是每个Firefox配置文件文件夹都有一个不同生成的名称 (例如:C:UsersUsernameAppDataRoamingMozillaFirefoxProfilesab1c2def.default
(
由于我想使脚本在多台PC上运行,因此我无法对路径进行硬编码,因此我希望能够读取路径的最后一部分并将其用作变量,以便我可以将路径更改为所需的文件夹以删除和添加其中的文件。
这是我开始的代码:
REM turning echo off
@echo off
REM changing directory to Profiles Folder, behind it is the variable Folder.
cd %appdata%MozillaFirefoxProfiles
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%MozillaFirefoxProfiles%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 pathwheremyprefs.jsfilelies
REM now I copy my fresh prefs.js" file into my Folder.
copy "prefs.js" "%appdata%MozillaFirefoxProfiles%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%MozillaFirefox" || 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 "pathtomyprefs.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%MozillaFirefox" || 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
循环读取配置文件.ini文件。分隔符集=
ini 文件用于将键与值分隔开来。令牌1
将是 密钥放置在%%A
而令牌*
将是存储在%%B
中的值。 如果键等于名为path
的键,则调用名为:profiledir
具有路径值的第一个参数,该参数应该是路径 到配置文件文件夹。
注意:使用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
的 stdout 传递给find
的 stdin。
注意:使用find /?
获取语法帮助。
REM Change to the profile dir.
cd /d "%~1" || exit /b 1
与主代码相同cd
只是它是本地设置的,因此仅以 in 结尾 被调用的标签。
REM Copy prefs.js to current dir.
echo copy /y "pathtomyprefs.js" "prefs.js"
copy
的/y
参数允许在没有确认的情况下覆盖,因此del
已经过时了。
注意:使用copy /?
获取语法帮助。
最后:删除copy
命令前面的echo
如果满意它显示复制命令正常。