Windows 批处理 - 嵌套循环 - Firefox 配置文件迁移



背景:

我正在尝试将 Firefox 配置文件从本地计算机迁移到用户的漫游配置文件目录。一些用户已经将配置文件位于他们的家庭驱动器中,而大多数用户没有。

我已经尝试使用Mike Kaply的CCK工具执行此操作,但不幸的是,它没有将Firefox配置文件目录迁移到用户的漫游配置文件,而只是指向没有Firefox配置文件所在的漫游配置文件目录。

因此,为了解决这个问题,我决定创建一个批处理,在目录"home"下的每个用户目录中查找目录"FirefoxProfile"。如果此文件夹不存在,它将创建它(隐藏文件夹)。此外,该脚本将遍历每个本地配置文件,在每个Firefox配置文件文件夹中搜索最新的places.sqlite文件(Firefox的书签文件),将其复制到home下的用户FirefoxProfile文件夹,最后将文件配置文件复制到AppData\Roaming\Mozilla下的用户Firefox文件夹.ini。

如果用户主目录下的 FirefoxProfile 文件夹确实存在,则脚本将执行与该文件夹不存在相同的步骤,但不会创建文件夹 FirefoxProfile。

我编写的脚本未按预期运行。我试图重写它(重新排列引号和括号,重新格式化代码),但它总是归结为以下问题: 该脚本删除 FOR 循环中的参数"/D"。同样从那里开始,脚本无法正确识别"%%"变量,而是删除前导"%"字符。

此外,FOR/F 循环有问题。苍蝇 3.txt 中的输出为:

目录/S/B/O:-D 测试用户1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite home\testuser1\FireFoxProfile\Default

但它应该回馈这样的东西:

测试用户1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\lh15n9tq.default\places.sqlite home\testuser1\FireFoxProfile\Default

我将非常感谢任何帮助。 提前谢谢。

脚本:

setlocal enabledelayedexpansion
SET HomeProfile=""
SET WSProfile=""
SET FFProfile=""
pushd \srv-xyzusers
cd home
FOR /D %%A in (*) DO (
SET "HomeProfile=%%A"
if not exist !HomeProfile!FireFoxProfile (
echo does not exist >> C:tmp1.txt
echo !HomeProfile!FireFoxProfileDefault >> C:tmp2.txt
cd profile_WS
FOR /D %%B in (!HomeProfile!.V2) DO (
SET "WSProfile=%%B"
FOR /F "usebackq delims=" %%C IN ('DIR !WSProfile!AppDataRoamingMozillaFirefoxProfilesplaces.sqlite /S /B /O:-D') DO (
SET "FFProfile=%%C"
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault >> C:tmp3.txt
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox >> C:tmp4.txt
))
) ELSE (
echo !HomeProfile!FireFoxProfileDefault >> C:tmp5.txt
FOR /D %%B IN (!HomeProfile!.V2) DO (
SET "WSProfile=%%B"
FOR /F "usebackq delims=" %%C IN ('DIR !WSProfile!AppDataRoamingMozillaFirefoxProfilesplaces.sqlite /S /B /O:-D') DO (
SET "FFProfile=%%C"
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault >> C:tmp6.txt
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox >> C:tmp7.txt)
))
)
popd
PAUSE

脚本指出:

为了测试脚本,我替换了实际代码,并使脚本将其输出写入文本文件。

问题:

对于每个用户,脚本失败如下

V:home>(
SET "HomeProfile=testuser1"  
if not exist !HomeProfile!FireFoxProfile (
echo does not exist  1>>C:tmp1.txt  
echo !HomeProfile!FireFoxProfileDefault  1>>C:tmp2.txt  
cd profile_WS  
FOR / %B in (!HomeProfile!.V2) DO (
SET "WSProfile=%B"  
FOR /F "usebackq delims" %C IN ('DIR /S /B /O:-D !WSProfile!AppDataRoamingMozillaFirefoxProfilesplaces.sqlite') DO (
SET "FFProfile=%C"  
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault  1>>C:tmp3.txt  
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox  1>>C:tmp4.txt 
) 
) 
)  ELSE (
echo !HomeProfile!FireFoxProfileDefault  1>>C:tmp5.txt  
FOR / %B IN (!HomeProfile!.V2) DO (
SET "WSProfile=%B"  
FOR /F "usebackq delims" %C IN ('DIR /S /B /O:-D !WSProfile!AppDataRoamingMozillaFirefoxProfilesplaces.sqlite') DO (
SET "FFProfile=%C"  
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault  1>>C:tmp6.txt  
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox  1>>C:tmp7.txt 
) 
) 
) 
) 
V:home>(
SET "WSProfile=testuser1.V2"  
FOR /F "usebackq delims" %C IN ('DIR /S /B /O:-D !WSProfile!AppDataRoamingMozillaFirefoxProfilesplaces.sqlite') DO (
SET "FFProfile=%C"  
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault  1>>C:tmp3.txt  
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox  1>>C:tmp4.txt 
) 
) 
V:home>(
SET "FFProfile=DIR"  
echo !FFProfile! home!HomeProfile!FireFoxProfileDefault  1>>C:tmp3.txt  
echo C:tmpprofiles.ini !WSProfile!AppDataRoamingMozillaFirefox  1>>C:tmp4.txt 
) 

引起我注意的是从这几行开始的:

cd profile_WS  
FOR / %B in (!HomeProfile!.V2) DO (
SET "WSProfile=%B" 

如果您查看以下行的第一行:

FOR /D %%B in (!HomeProfile!.V2) DO (

这应该解析为%%A.V2,因此您实际上只是将WSProfile设置为\srv-xyzusershomeprofile_WStestuser1.V2,并且可能,因为此时您的当前目录应该\srv-xyzusershomeprofile_WS,只需使用Set "WSProfile=%CD%%%A.V2"即可。

您采取的步骤之间似乎有所不同,具体取决于用户主目录下是否存在 FirefoxProfile 文件夹。如果它不存在,您将目录更改为profile_WS并且永远不会从那里返回,这将在脚本的其余部分产生问题。如果它确实存在,你住在home

编辑

我决定发布这个,尽管它不是OP问题的解决方案,因为它可能对他们和许多其他人有用。

这将尝试为所有标准本地用户查找所有活动的 Firefox 配置文件。它将这些配置文件路径保存到变量的格式%UsersName[i]%其中i可以是找到的每个用户配置文件的递增整数。(这些变量也打印到屏幕上以供参考)。

@Echo Off
For /F "UseBackQ Tokens=1* Delims==" %%A In (
`WMIc Path Win32_UserProfile Where "Special!='True'" Get LocalPath /Value`
) Do For /F "Delims=" %%C In ("%%B") Do Call :Users "%%C"
If Defined i If Not "%i%"=="0" (SetLocal EnableDelayedExpansion
For /L %%A In (1,1,%i%) Do Echo( %%!UN![%%A]%% = !%UN%[%%A]!
EndLocal
Echo( Press any key to exit...
Timeout -1 1>Nul)
Exit/B
:Users
Set "PF=%~1AppDataRoamingMozillaFirefox"
If Not Exist "%PF%" GoTo :EOF
Set "UN=%~nx1"
Set "i=0"
For /F "Tokens=1* Delims==" %%A In (
'FindStr/R "^Path=.*" "%PF%Profiles.ini"') Do (Set "FP=%%B"
Call :Profs "%%FP:/=%%")
GoTo :EOF
:Profs
Set/A "i+=1"
If Exist "%PF%%~1" (Set "%UN%[%i%]=%PF%%~1") Else Set "%UN%[%i%]=%~1"

该脚本尚未在多用户系统上或具有多个配置文件的用户上进行测试,我仅将其作为一个概念编写。

最新更新