我遇到了问题,而且我已经工作了几个小时。我不知道为什么它不会工作,但我有一种感觉它与for循环中的for循环有关。它有点难以解释。所以这里:
我有这个代码可行。它的作用是将3个文件从programdata复制到appdata。我们需要" for循环"因为该文件夹中的配置文件%var%始终不同。它会找到名称并将其输入到" cd"成。
Echo Restore Firefox Files
set copycmd=/y
timeout 7
c:
cd "%userprofile%\AppData\Roaming\Mozilla\Firefox\"
for /f "tokens=1,2 delims=/" %%i in ('findstr /l ".default" profiles.ini') do call set var1=%%j
cd profiles\%var1%
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\places.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\places.sqlite"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\key3.db" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\key3.db"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\signons.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\signons.sqlite"
重点是,该代码有效。它从我想要的地方复制。这是我的问题。我有这个代码。不起作用。请注意,主循环从它所说的" Echo循环开始,通过每个用户并复制文件"。
Echo Set Usernames into Variables (User1, User2, etc)
for /F "tokens=*" %%A in (C:\ProgramData\TLCloud\WindowsUsers.txt) do (
SET /A vidx=!vidx! + 1
set user!vidx!=%%A
set /A i = !i! + 1
)
Echo Put Usernames into an Array
set i=0
for /f "delims=" %%a in (C:\ProgramData\TLCloud\WindowsUsers.txt) do (
set /A i+=1
set list[!i!]=%%a
)
Echo Loop Through Each User and Copy Files
for /F "tokens=2 delims==" %%s in ('set list[') do (
If NOT "%%s" == "Guest" (
If NOT "%%s" == "Administrator" (
Echo Restore Firefox Files
set copycmd=/y
::start "browser" /d "C:\Program Files (x86)\Mozilla Firefox" firefox.exe
timeout 7
c:
cd "%userprofile%\AppData\Roaming\Mozilla\Firefox\"
for /f "tokens=1,2 delims=/" %%i in ('findstr /l ".default" profiles.ini') do call set var1=%%j
cd profiles\%var1%
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\places.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\places.sqlite"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\key3.db" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\key3.db"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\signons.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%var1%\signons.sqlite"
)
)
)
为什么这段代码不起作用?忽略变量和数组代码,而不是"用户名"我最终可以使用" %% s"作为更改用户名的变量。但是没有理由这不应该工作,或者我不允许在另一个for循环中使用for循环?
非常感谢任何帮助。
答案 0 :(得分:0)
%var1%
开始处理最外层循环时, set list[
已替换为空字符串
一种解决方案是使用!var1!
而不是%var1%
,因为看起来已经启用了延迟环境变量扩展。在这种情况下,call set var1=%%j
也应该更正为set var1=%%j
。
另一种解决方案是使用以下代码:
Echo Set Usernames into Variables (User1, User2, etc)
for /F "tokens=*" %%A in (C:\ProgramData\TLCloud\WindowsUsers.txt) do (
SET /A vidx=!vidx! + 1
set user!vidx!=%%A
set /A i = !i! + 1
)
Echo Put Usernames into an Array
set i=0
for /f "delims=" %%a in (C:\ProgramData\TLCloud\WindowsUsers.txt) do (
set /A i+=1
set list[!i!]=%%a
)
Echo Loop Through Each User and Copy Files
for /F "tokens=2 delims==" %%s in ('set list[') do (
If NOT "%%s" == "Guest" (
If NOT "%%s" == "Administrator" (
Echo Restore Firefox Files
set copycmd=/y
rem start "browser" /d "C:\Program Files (x86)\Mozilla Firefox" firefox.exe
rem timeout 7
cd /D "%userprofile%\AppData\Roaming\Mozilla\Firefox\"
for /f "tokens=1,2 delims=/" %%i in ('findstr /l ".default" profiles.ini') do (
cd "profiles\%%j"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\places.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\places.sqlite"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\key3.db" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\key3.db"
if exist "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\signons.sqlite" copy "C:\Programdata\TLCloud\BrowserBackup\Username\MozillaRoaming\Firefox\Profiles\%%j\signons.sqlite"
)
)
)
)
答案 1 :(得分:0)
两个问题。
::
样式评论是一个损坏的标签。它会导致FOR
混淆并终止。在块语句(带括号的系列语句)中用REM
替换它。
第二是更重要,但很容易治愈。
您还没有向我们展示您的整批产品。它会从set list[!i!]=%%a
这样的声明开始,即delayed expansion
转 ON 。这非常重要。
在阻止声明中,任何%var%
都会在解析时进行评估和替换,因此%var1%
将替换为var1
的值当整个块(即最外层 FOR
被解析时。由于您试图在最内层循环中更改var1
,要访问更改的值,您需要使用{ {1}}表示当前,而不是变量的分析时间值。
现在,由于似乎已启用延迟展开,因此只需将!var1!
替换为%var1%
即可 解决方案。不过很难注意到,!var1!
正在将值var1
作为对象,所以似乎根本没有理由使用%%j
- 只需将其替换为{{1} }}!