这个问题是为了回答此主题正在运行FOR
批量UAC 提升代码产生涉及不存在目录的大量错误。
以下是一个截图:
问题在于错误插入Local
和重复Application Data
文件夹名称。不使用 UAC 提升代码时不会出现这些错误消息。
是否有可能是 WScript 中的某些东西调用了错误的对象环境设置HOMEPATH
?WshEnvironment
这可能与 XP 升级到 Win 7 HP(几年前)有关,出于某种原因,Documents and Settings
、Local Settings
和的幽灵Application Data
不会消失。只需输入以下命令即可
set LOCALAPPDATA=C:\Users\%username%\AppData\Local
set APPDATA=C:\Users\%username%\AppData\Roaming
什么都没改变。使用管理员权限%LocalAppData%
似乎不适合批量操作。搜索注册表会显示几乎不存在类似的东西,Application Data
因此来源尚待确定。也许是 Shell 对象的其他方面?
以下是脚本 + 复制 % 粘贴
:::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get admin rights (thanks to TanisDLJ at Stackoverflow)
:::::::::::::::::::::::::::::::::::::::::
@echo off
color 1E
mode 100,50
VERIFY > nul
CLS
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo args = "" >> "%temp%\getadmin.vbs"
echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
echo args = args ^& strArg ^& " " >> "%temp%\getadmin.vbs"
echo Next >> "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" %*
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0"
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get admin rights (thanks to TanisDLJ at Stackoverflow)
:::::::::::::::::::::::::::::::::::::::::
@echo off
color 1E
mode 100,50
VERIFY > nul
CLS
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo args = "" >> "%temp%\getadmin.vbs"
echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
echo args = args ^& strArg ^& " " >> "%temp%\getadmin.vbs"
echo Next >> "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" %*
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0"
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0"
set CURRDRIVE=C
FOR /F "usebackq delims==" %%G IN (`dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "myString"`) DO (set "foundMyString=%%~pG")
pause
请注意,如果不运行 UAC 代码(全部位于“START”上方),则此计算机上不会显示垃圾邮件,并且这两种情况下似乎都运行正常。在提升的命令提示符中,将“START”下方的代码复制到“%”下,用“%”替换“%%”,仍然会收到相同的消息。
答案1
编辑: 来自 TechNet 论坛的 Frederik Long 的回答
该问题与从 Windows XP 升级到 Windows 7 导致的递归连接点有关。解决方法是运行以下命令:
rd“%SYSTEMDRIVE%\ Documents和Settings”
它会删除连接点但不删除任何文件。
看起来您在脚本中使用了两次 UAC 提升代码,并且存在冗余,
Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0"
尽管我不确定为什么您没有PUSHD
相应的POPD
。
除此之外,我没发现什么问题。我修改了你的脚本,加入了%%~pG
我认为匹配以下路径的回显:字符串或包含子目录的路径字符串在其文件夹名称中。
我变了
FOR /F "usebackq delims==" %%G IN (`dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "myString"`) DO (set "foundMyString=%%~pG")
到
FOR /F "usebackq delims==" %%G IN (`dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "Macromedia"`) DO (set "foundMyString=%%~pG" & echo %%~pG)
CURRDRIVE
并执行了设置为的脚本C
,我没有遇到任何问题,例如重复%LOCALAPPDATA%
或%APPDATA%
路径。这是我得到的结果:
\用户\Vinayak\应用程序数据\本地\Macromedia\ \用户\Vinayak\应用程序数据\漫游\ \用户\Vinayak\应用程序数据\漫游\Macromedia\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\#安全\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\macromedia.com\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\macromedia.com\support\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\macromedia.com\support\flashplayer\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\www.macromedia.com\ \用户\Vinayak\应用程序数据\漫游\Macromedia\Flash Player\www.macromedia.com\bin\ ...