批处理脚本以删除所有用户桌面上的所有图标

时间:2018-07-13 13:58:48

标签: batch-file

当前正在寻找一种从所有用户桌面删除所有图标的方法。我进行了实验,直到创建了以下脚本,该脚本允许我从单个用户中删除所有脚本,但如果没有硬编码,我将无法将其扩展到单个PC上的所有用户。

@echo off
cd %%#
del C:\Users\%Userprofile%\Desktop\*.* /s /q
for /r %%# in (.) do rmdir %%# /s
cls

我现在正在寻找是否可以在没有硬编码路径的情况下将其扩展到多个用户,因为我当时不知道当时哪个用户正在使用计算机。

2 个答案:

答案 0 :(得分:0)

由于您不想对路径进行硬编码,因此我们可以使用FOR为每个用户搜索.ico中的\Desktop个文件。下面的脚本将搜索每个用户的桌面,删除所有.ico文件,然后提示用户完成操作。

@ECHO OFF
@GOTO :search

:search
FOR /D %%G IN ("C:\Users\*") DO IF EXIST "%%~fG\desktop\*.ico" (
    set correctDir=%%G\desktop
    goto :foundFile
)
goto :finished

:foundFile
cd "%correctDir%"
del /S *.ico
goto :search

:finished
echo All Icons removed from users desktops!
pause
goto :eof

FOR /D使用%%G变量遍历所有目录。 %%~fG扩展到%% G中目录的完整路径。
IF EXIST检查文件是否存在。
goto :eof退出脚本

答案 1 :(得分:0)

在编写或使用旨在删除文件/文件夹的脚本时,必须格外小心。一个小小的错误就可能导致灾难。

例如,这段代码:cd "MyFolder" & del /q *.*极其危险,它会假定先前的cd命令已将当前目录更改为MyFolder,从而从当前目录中删除所有文件,因此在失败的del命令将从当前目录中删除所有文件,而不是MyFolder。但是此代码是安全的:cd "MyFolder" && del /q *.*。仅当del命令已成功将当前目录更改为cd时,才会执行MyFolder命令。

现在回到原来的问题,即扩展代码以消灭PC所有其他用户的“桌面”。

首先应考虑的是,由于NTFS文件系统权限,普通用户通常无权访问其他用户的桌面文件夹,从而避免了非管理员访问其他用户的配置文件。因此,生成的脚本将必须具有管理特权才能运行。甚至以管理员身份运行脚本也可以确保成功,因为每个用户都可以明确拒绝对其用户配置文件/文件夹甚至管理员的访问。

另一件事是,在大多数情况下,每个用户的桌面目录都位于Desktop目录中名为%USERPROFILE%的文件夹中,例如C:\Users\John\Desktop,但并非总是如此。实际上,可以将每个用户的桌面目录定义为位于Desktop以外的任何位置并放置在其他文件夹中。 除桌面以外的其他特殊文件夹就是这种情况。

正确的方法是首先从注册表中检索用户配置文件列表,然后针对每个用户配置文件查询用户桌面的位置。

:: WipeDesktops.cmd
:: This script should be runned as Administrator to be able to access and delete the 'Desktop' contents of other users.

@echo off
setlocal EnableExtensions EnableDelayedExpansion

:: To turn TestMode off It is highly recommended that to invoke the script with "/TestMode:Off" switch rather than manually setting TestMode to 0
set "TestMode=1"
set "DeleteCommandConfirm=rd /s"
set "DeleteCommandUnsafe=rd /s /q"

for /F "tokens=1,2 delims=:" %%A in ("%~1") do if /i "%%A"=="/TestMode" (
    if /i "%%B"=="Off" (set "TestMode=0") else set "TestMode=1"
)

set "DeleteCommand=%DeleteCommandConfirm%"
if %TestMode% NEQ 0 (
    echo Running in Test Mode
    set "DeleteCommand=echo %DeleteCommand%"
) else (
    set "DeleteCommand=2>nul %DeleteCommand%"
)

set "SID_Prefix=S-1-5-21-"
set "ProfileList=HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList"
set "ShellFoldersBase=Software\Microsoft\Windows\CurrentVersion\Explorer"
set "ShellFolders=%ShellFoldersBase%\Shell Folders"
set "UserShellFolders=%ShellFoldersBase%\User Shell Folders"

for /F "delims=" %%K in ('reg query "%ProfileList%" /k /f "%SID_Prefix%"') do (
    set "ProfileKey=%%~K"
    set "ProfileKey=!ProfileKey:HKEY_LOCAL_MACHINE\=HKLM\!"
    if "!ProfileKey!" NEQ "!ProfileKey:HKLM\=!" (
        set "ProfilePath="
        for /F "tokens=2*" %%A in ('reg query "!ProfileKey!" /v "ProfileImagePath" 2^>nul') do (
            set "ProfilePath=%%~B"
        )
        if defined ProfilePath if exist "!ProfilePath!\" (
            set "Desktop="
            set "SID=!ProfileKey:%ProfileList%\=!"
            for %%S in ("%UserShellFolders%", "%ShellFolders%") do (
                if not defined Desktop (
                    for /F "tokens=2*" %%A in ('reg query "HKU\!SID!\%%~S" /v "Desktop" 2^>nul') do (
                        set "Desktop=%%~B"
                    )
                    if defined Desktop (
                        REM %USERPROFILE% value is different for each user so it can not be expanded
                        for %%A in ("!ProfilePath!") do set "Desktop=!Desktop:%%USERPROFILE%%=%%~A!"
                        if not exist "!Desktop!\" set "Desktop="
                    )
                )
            )
            if not defined Desktop set "Desktop=!ProfilePath!\Desktop"
            REM Skip network paths
            if "!Desktop:~0,2!" NEQ "\\" if exist "!Desktop!\" (
                cd /d "!Desktop!" 2>nul && (
                    echo Removing 'Desktop' contents in !Desktop! ...

                    REM Since there is an open handle to the 'Desktop' folder, The contents of the folder will be removed but the folder itself remains.
                    %DeleteCommand% "!Desktop!"
                ) 
            )
        )
    )
)

出于安全原因,它具有2种操作模式:

  • 测试模式(默认):在此模式下,它仅显示命令以及可以删除的路径,但不会执行实际的删除操作

  • 普通模式(使用/TestMode:Off开关调用)将列出并实际上删除检测到的用户桌面。

工作方式

它首先从注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList中检索列表用户配置文件,每个用户配置文件都位于注册表项下,其名称等于以S-1-5-21-开头的相应用户SID。

对于每个SID密钥,它查询ProfileImagePath的值以获得用户配置文件目录的位置。

然后,它按照列出的顺序从两个注册表位置查询用户桌面的位置:

HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

,并使用ProfileImagePath的值来解析该用户的%USERPROFILE%变量的值,该变量通常出现在User Shell Folders键下的特殊位置

最后,如果无法通过注册表确定用户桌面的位置,则采用默认路径%USEPROFILE%\Desktop

缺少什么?

不涵盖共享用户桌面,取决于Windows版本,共享桌面通常位于%ALLUSERSPROFILE%\Desktop%PUBLIC%\Desktop上。 但是可以从以下注册表项中获取确切的位置:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

因此,剩下的事情我会留给你,以完成缺失的部分。

相关问题