批次目录名称太长

批次目录名称太长

这个问题是为了回答此主题正在运行FOR批量UAC 提升代码产生涉及不存在目录的大量错误。

以下是一个截图:

在此处输入图片描述

问题在于错误插入Local和重复Application Data文件夹名称。不使用 UAC 提升代码时不会出现这些错误消息。

是否有可能是 WScript 中的某些东西调用了错误的对象环境设置HOMEPATHWshEnvironment这可能与 XP 升级到 Win 7 HP(几年前)有关,出于某种原因,Documents and SettingsLocal 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\
...

相关内容