Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Windows批处理-嵌套循环-Firefox配置文件迁移_Loops_Batch File_Firefox_Cmd - Fatal编程技术网

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

Loops Windows批处理-嵌套循环-Firefox配置文件迁移,loops,batch-file,firefox,cmd,Loops,Batch File,Firefox,Cmd,背景: 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

背景:

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
我正在尝试将Firefox配置文件从本地机器迁移到用户的漫游配置文件目录。一些用户的主驱动器中已经有了该配置文件,而大多数用户没有

我已经用Mike Kaply的CCK工具尝试过了,但不幸的是,它没有将Firefox配置文件目录迁移到用户的漫游配置文件,而是指向没有Firefox配置文件的漫游配置文件目录

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

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

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

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

目录/序列/序列/输出:-D testuser1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\places.sqlite home\testuser1\FireFoxProfile\Default

但它应该会有这样的回报:

testuser1.V2\AppData\Roaming\Mozilla\Firefox\Profiles\lh15n9tq.default\places.sqlite home\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
脚本状态:

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
为了测试脚本,我替换了实际代码,并让脚本将其输出写入文本文件

问题:

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 /D %%B in (!HomeProfile!.V2) DO (
这应该解析为
%%A.V2
,因此您实际上只是将WSProfile设置为
\\srv xyz\users\home\profile\u WS\testuser1.V2
,并且可能,因为此时您的当前目录应该是
\\srv xyz\users\home\profile\u WS
,只需使用
设置“WSProfile=%CD%\%A.V2”

根据用户主目录下是否存在FirefoxProfile文件夹,您正在执行的步骤之间似乎存在差异。如果它不存在,您将目录更改为
profile\WS
,并且从不从那里返回,这将在脚本的其余部分产生问题。如果它确实存在,您将呆在
家中

编辑

尽管这不是OP问题的解决方案,但我还是决定发布这篇文章,因为其中很多内容可能对他们和其他许多人都有用

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

@Echo关闭
对于/F“UseBackQ令牌=1*Delims==”%%A,在(
`WMIc路径Win32_用户配置文件,其中“特殊!='True'”获取本地路径/值`
)Do For/F“Delims=“%%C In”(%%B”)Do Call:Users“%%C”
如果已定义,则i如果未定义“%i%”==“0”(SetLocal EnableDelayedExpansion
对于(1,1,%i%)中的/L%%A,执行回显(%%!UN![%%A]%=!%UN%%[%%A)!
端部
回声(按任意键退出。。。
超时(1>Nul)
退出/B
:用户
设置“PF=%1\AppData\Roaming\Mozilla\Firefox\”
如果不存在“%PF%”转到:EOF
设置“UN=%~nx1”
设置“i=0”
对于/F“Tokens=1*Delims==”%%A In(
“FindStr/R”^Path=.'%PF%Profiles.ini')Do(设置为“FP=%%B”
调用:Profs“%%FP:/=\%%”)
后藤:EOF
:Profs
设置/A“i+=1”
如果存在“%PF%%~1\”(设置“%UN%[%i%]=%PF%%~1”),则设置“%UN%[%i%]=%1”

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

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