Il nome della list di batch è troppo lungo

Questa domanda è stata posta come risposta a questo thread where eseguire FOR loop in batch con codice di elevazione UAC genera errori voluminosi che coinvolgono directory inesistenti.

Ecco uno screenshot di questo tipo:

immettere qui la descrizione dell'immagine

Il problema è l'inserimento errato di nomi di cartelle Local e ripetute di Application Data . Questi messaggi di errore non vengono visualizzati quando non si utilizza il codice di elevazione UAC.

È ansible che qualcosa in WScript invoca le impostazioni di ambiente sbagliate per WshEnvironment sull'object WshEnvironment ? Può trattarsi di più dell'aggiornamento (anni fa) di XP a Win 7 HP, where per qualche motivo i fantasmi di Documents and Settings , Local Settings e Application Data non si allontaneranno. Semplicemente mettendo in comandi come

 set LOCALAPPDATA=C:\Users\%username%\AppData\Local set APPDATA=C:\Users\%username%\AppData\Roaming 

non cambia niente. Con privilegi di amministratore %LocalAppData% non sembra giusto in batch. La ricerca del Registro di sistema mostra praticamente nix per le cose come i Application Data modo che la fonte sia ancora da determinare. Forse qualche altra faccia dell'object Shell?

Ecco lo script + copy% paste

 ::::::::::::::::::::::::::::::::::::::::: :: 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 

Notare che su questa macchina lo spam non viene visualizzato se non è in esecuzione il codice UAC (tutto sopra "START") e sembra funzionare bene in entrambi i casi. Copiare il codice sotto "START" con "%" sostituendo "%%" in un prompt dei comandi elevato e ricevere ancora gli stessi messaggi.

EDIT: Risposta da Frederik Long da TechNet Forums

Il problema è collegato a un punto di giunzione ricorsivo che risulta dall'aggiornamento a Windows 7 da Windows XP. La correzione è quella di eseguire il seguente command:

 rd "% SYSTEMDRIVE% \ Documenti e impostazioni"

Rimuove il punto di giunzione senza eliminare alcun file.


Sembra che tu abbia usato il codice di elevazione UAC due volte nello script e che vi sia un ridondante Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0" anche se non so perché hai un PUSHD senza un corrispondente POPD .

Altrimenti non vedo molto un problema. Ho modificato il tuo script per includere l'echo di %%~pG che credo corrisponde a routes che contengono myString o routes che dispongono di sottodirectory con myString nei nomi delle cartelle.

Ho cambiato

 (Impostare "foundMyString = %% INITI" = "" "" "" "" " % ~ pG ")

a

 (Impostare "foundMyString = %% INIZIO =" "%% G IN (` dir% CURRDRIVE%: \ / A: D / O: G / S / B ^ | FIND / I "Macromedia" % ~ pG "& echo %%~ pG)

ed eseguito lo scirip con CURRDRIVE impostato su C e non ho eseguito problemi come la ripetizione di %LOCALAPPDATA% o %APPDATA% . Ecco quello che ho ottenuto:

 \ 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 \
 \ Utenti \ 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 \
 ...