Batch-Script将Folderpath定义为Variable

时间:2018-05-02 15:44:49

标签: batch-file variables path definition

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

问题是每个Firefox Profilefolder都有不同的生成名称 (例如: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

那我该怎么做?

1 个答案:

答案 0 :(得分:0)

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

这会更改当前目录。 ||是右侧的运行命令 如果左侧命令失败。如果失败,将退出errorlevel 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 删除外部双引号。被叫标签返回给主叫方 完成后。

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

"%~1"是引用的第一个参数。它与find命令和if相呼应 找到.default,然后它会继续。 |被称为管道 来自echo的stdout被传递给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的{​​{1}}参数允许覆盖而无需确认 copy已过时。

注意:使用del获取语法帮助。

最后:删除copy /?命令前面的echo如果满意它显示复制命令正常。