复制文件时批处理脚本问题

时间:2014-08-11 17:40:44

标签: windows batch-file cmd

我遇到了问题,而且我已经工作了几个小时。我不知道为什么它不会工作,但我有一种感觉它与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循环?

非常感谢任何帮助。

2 个答案:

答案 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} }}!