O nome do diretório de lote é muito longo

2

Esta questão foi colocada como uma resposta para este tópico onde executando FOR loops em lote com Código de elevação do UAC gera erros volumosos envolvendo diretórios inexistentes.

Aqui está uma captura de tela de tal:

OproblemaéainserçãoincorretadosnomesdaspastasLocaleApplicationDatarepetidos.EssasmensagensdeerronãoaparecemquandonãoseusaocódigodeelevaçãodoUAC.

ÉpossívelquealgonoWScriptestejainvocandoasconfiguraçõesincorretasdoambienteparaHOMEPATHnoobjetoWshEnvironment?Podeestarrelacionadomaiscomaatualização(anosatrás)doXPparaoWin7HP,onde,poralgummotivo,osfantasmasdeDocumentsandSettings,LocalSettingseApplicationDatanãodesaparecerão.Bastacolocarcomandoscomo

setLOCALAPPDATA=C:\Users\%username%\AppData\LocalsetAPPDATA=C:\Users\%username%\AppData\Roaming

nãomudanada.Comprivilégiosdeadministrador%LocalAppData%nãoparececertoemlote.PesquisandooregistrotrazpraticamentenixparacoisascomoApplicationData,entãoafonteaindaestáparaserdeterminada.TalvezalgumaoutrafacetadoObjetoShell?

Aquiestáoscript+copy%paste

:::::::::::::::::::::::::::::::::::::::::::Automaticallycheck&getadminrights(thankstoTanisDLJatStackoverflow):::::::::::::::::::::::::::::::::::::::::@echooffcolor1Emode100,50VERIFY>nulCLS::BatchGotAdmin:-------------------------------------REM-->Checkforpermissions>nul2>&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

Note que nesta máquina o spam não é exibido se não estiver executando o código UAC (todos acima do "START") e parece funcionar bem em ambos os casos. Copie o código abaixo do "START" com "%" substituindo "%%" em um prompt de comando elevado e ainda receba as mesmas mensagens.

    
por Laurie Stearn 06.12.2014 / 12:48

1 resposta

0

EDITAR: Responder por Frederik Long do TechNet Fóruns

O problema está ligado a um ponto de junção recursivo resultante da atualização para o Windows 7 a partir do Windows XP. A correção é executar o seguinte comando:

rd "%SYSTEMDRIVE%\Documents and Settings"

Remove o ponto de junção sem excluir nenhum arquivo.

Parece que você usou o código de elevação do UAC duas vezes no seu script e que há um Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0" redundante, embora eu não saiba por que você tem um PUSHD sem um POPD correspondente.

Além disso, não vejo muito problema. Eu modifiquei seu script para incluir o eco de %%~pG , que, na minha opinião, corresponde a caminhos que contêm myString ou caminhos com subdiretórios com myString nos nomes das pastas.

eu mudei

FOR /F "usebackq delims==" %%G IN ('dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "myString"') DO (set "foundMyString=%%~pG")

para

FOR /F "usebackq delims==" %%G IN ('dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "Macromedia"') DO (set "foundMyString=%%~pG" & echo %%~pG)

e executou o sciript com CURRDRIVE definido como C e não tive problemas como a repetição de %LOCALAPPDATA% ou %APPDATA% caminhos. Aqui está o que eu tenho:

\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\
...
    
por 07.12.2014 / 10:34