2

Этот вопрос был задан в качестве ответа на этот поток, где выполнение циклов 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" с «%», заменив «%%» в командной строке с повышенными привилегиями, и получите те же сообщения.

1 ответ1

0

РЕДАКТИРОВАТЬ: Ответ Фредерик Лонг с форумов TechNet

Проблема связана с рекурсивной точкой соединения, приводящей к обновлению формы до Windows 7 с Windows XP. Исправление заключается в запуске следующей команды:

rd "%SYSTEMDRIVE%\Documents and Settings"

Это удаляет точку соединения без удаления каких-либо файлов.


Похоже, что вы дважды использовали код повышения UAC в своем сценарии и что существует избыточный Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0" хотя я не уверен, почему у вас есть PUSHD без соответствующее POPD .

Кроме этого я не вижу большой проблемы. Я изменил ваш сценарий, чтобы включить отображение %%~pG которое, как мне кажется, соответствует путям, которые содержат либо myString, либо пути, у которых есть подкаталоги с myString в именах их папок.

Я изменился

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% . Вот что я получил:

\Users\Vinayak\AppData\Local\Macromedia\
\Users\Vinayak\AppData\Roaming\
\Users\Vinayak\AppData\Roaming\Macromedia\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\#Security\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\macromedia.com\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\flashplayer\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\www.macromedia.com\
\Users\Vinayak\AppData\Roaming\Macromedia\Flash Player\www.macromedia.com\bin\
...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .