【问题标题】:Windows batch - Nested loop - Firefox profile migrationWindows 批处理 - 嵌套循环 - Firefox 配置文件迁移
【发布时间】:2017-04-13 14:04:50
【问题描述】:

背景:

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

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

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

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

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

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

DIR /S /B /O:-D testuser1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite 主页\testuser1\FireFoxProfile\Default

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

testuser1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\lh15n9tq.default\places.sqlite 主页\testuser1\FireFoxProfile\Default

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

脚本:

setlocal enabledelayedexpansion
SET HomeProfile=""
SET WSProfile=""
SET FFProfile=""

pushd \\srv-xyz\users
cd home
FOR /D %%A in (*) DO (
SET "HomeProfile=%%A"
if not exist !HomeProfile!\FireFoxProfile (
echo does not exist >> C:\tmp\1.txt
echo !HomeProfile!\FireFoxProfile\Default >> C:\tmp\2.txt
cd profile_WS
FOR /D %%B in (!HomeProfile!.V2) DO (
SET "WSProfile=%%B"
FOR /F "usebackq delims=" %%C IN ('DIR !WSProfile!\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite /S /B /O:-D') DO (
SET "FFProfile=%%C"
echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default >> C:\tmp\3.txt
echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox >> C:\tmp\4.txt
))
) ELSE (
echo !HomeProfile!\FireFoxProfile\Default >> C:\tmp\5.txt
FOR /D %%B IN (!HomeProfile!.V2) DO (
SET "WSProfile=%%B"
FOR /F "usebackq delims=" %%C IN ('DIR !WSProfile!\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite /S /B /O:-D') DO (
SET "FFProfile=%%C"
echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default >> C:\tmp\6.txt
echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox >> C:\tmp\7.txt)
))
)
popd
PAUSE

脚本状态:

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

问题:

对于每个用户,脚本都会失败,如下所示

V:\home>(
SET "HomeProfile=testuser1"  
 if not exist !HomeProfile!\FireFoxProfile (
echo does not exist  1>>C:\tmp\1.txt  
 echo !HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\2.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!\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite') DO (
SET "FFProfile=%C"  
 echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\3.txt  
 echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox  1>>C:\tmp\4.txt 
) 
) 
)  ELSE (
echo !HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\5.txt  
 FOR / %B IN (!HomeProfile!.V2) DO (
SET "WSProfile=%B"  
 FOR /F "usebackq delims" %C IN ('DIR /S /B /O:-D !WSProfile!\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite') DO (
SET "FFProfile=%C"  
 echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\6.txt  
 echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox  1>>C:\tmp\7.txt 
) 
) 
) 
) 

V:\home>(
SET "WSProfile=testuser1.V2"  
 FOR /F "usebackq delims" %C IN ('DIR /S /B /O:-D !WSProfile!\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite') DO (
SET "FFProfile=%C"  
 echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\3.txt  
 echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox  1>>C:\tmp\4.txt 
) 
) 

V:\home>(
SET "FFProfile=DIR"  
 echo !FFProfile! home\!HomeProfile!\FireFoxProfile\Default  1>>C:\tmp\3.txt  
 echo C:\tmp\profiles.ini !WSProfile!\AppData\Roaming\Mozilla\Firefox  1>>C:\tmp\4.txt 
) 

引起我注意的地方是以下几行:

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

【问题讨论】:

  • 显然,FOR / %B 是个问题。您在控制台输出中看到了什么错误的输出?
  • 您是否知道每个用户可以拥有多个 Firefox 配置文件,并且这些配置文件几乎可以位于任何地方?仅仅因为最近修改了书签文件并不能表明用户最常使用的配置文件。 (我知道大多数人可能只是使用单个随机命名的 *.default 位置,但我不会称其为可靠假设).
  • 你好@Lit,谢谢你的回答。标题“问题:”下的代码是脚本的确切输出,仅针对单个用户文件夹,在本例中为 testuser1。每个用户目录的输出都是相同的。
  • 您好@Compo,感谢您的回答。我们的环境受到严格限制,用户无法在另一个位置创建另一个配置文件,这就是我确定他们使用标准 *.default 配置文件的原因。尽管如此,还是感谢您的意见。
  • 如果阻止用户创建多个配置文件,那么递归检查最近修改的书签文件没有任何意义,他们将在*.default 路径下只有一个。您还知道他们的配置文件目录的实际路径写在已知位置的文件中吗?您可以从那里检索/解析它们。

标签: loops batch-file firefox cmd


【解决方案1】:

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

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

这应该解析为%%A.V2,因此您实际上只是将 WSProfile 设置为\\srv-xyz\users\home\profile_WS\testuser1.V2,并且可能,因为此时您的当前目录应该是\\srv-xyz\users\home\profile_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=%~1\AppData\Roaming\Mozilla\Firefox\"
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"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多