2017-04-13 146 views
0

背景:Windows批處理 - 嵌套循環 - Firefox的配置文件遷移

我試圖從本地機器上的Firefox配置遷移到用戶的漫遊配置文件目錄。一些用戶已經在他們的家庭驅動器中擁有該配置文件,但大多數用戶沒有。

我已經試圖用Mike Kaply的CCK工具做這件事,但不幸的是,它不會將Firefox配置文件目錄遷移到用戶的漫遊配置文件,而只是指向沒有配置Firefox配置文件的漫遊配置文件目錄。

因此,爲了解決這個問題,我決定創建一個批處理,該目錄在目錄「home」目錄下的每個用戶目錄下查找目錄「FirefoxProfile」。如果這個文件夾不存在,它會創建它(隱藏文件夾)。此外,該腳本將遍歷每個本地配置文件,在每個Firefox配置文件文件夾中搜索最新的places.sqlite文件(Firefox的書籤文件),將其複製到家庭中的用戶FirefoxProfile文件夾,最後將文件profiles.ini複製到用戶在AppData \ Roaming \ Mozilla下的Firefox文件夾。

如果用戶主目錄下的文件夾FirefoxProfile確實存在,則腳本將執行與文件夾不存在相同的步驟,但不會創建文件夾FirefoxProfile。

我寫的腳本沒有按預期運行。我試圖重寫它(重新排列引號和括號,重新格式化代碼),但總是歸結爲以下問題: 該腳本刪除FOR循環中的參數「/ D」。此外,腳本無法正確識別「%%」變量,而是刪除前導的「%」字符。

此外FOR/F循環出現問題。在flie 3.txt的輸出是:

DIR/S/B/O:-D testuser1.V2 \應用程序數據\漫遊\ Mozilla的\火狐\概況\ places.sqlite 家\ testuser1 \ FireFoxProfile \默認

但它應該給回是這樣的:

testuser1.V2 \應用程序數據\漫遊\ Mozilla的\火狐\ Profiles文件\ lh15n9tq.default \ places.sqlite 家\ testuser1 \ FireFoxProfile \默認

我非常感謝任何幫助。 在此先感謝。

腳本:

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" 
+0

顯然,'FOR /%B'是一個問題。你在控制檯輸出中看到哪裏產生了錯誤的輸出? – lit

+0

您是否知道每個用戶都可以擁有多個Firefox配置文件,並且這些配置文件幾乎可以放在任何位置?僅僅因爲最近修改了書籤文件並不能說明用戶最常用的配置文件。 _(我知道大多數人可能只是使用一個隨機命名的* .default位置,但我不會稱這是一個強有力的假設)。 – Compo

+0

Hello @Lit,謝謝你的回答。 Titel下的代碼「The Problem:」是腳本的精確輸出,僅用於單個用戶文件夾,在本例中爲testuser1。 每個用戶目錄的輸出都相同。 – BSL

回答

0

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

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" 

該腳本尚未在多用戶系統或多用戶配置文件的用戶上進行過測試,我只將它寫成概念。