【问题标题】:batch command to backup folders and rename with timestamp doesn't works in XP power user permission用于备份文件夹和重命名时间戳的批处理命令在 XP 高级用户权限中不起作用
【发布时间】:2015-01-27 18:53:41
【问题描述】:

我在下面形成了一个批处理命令脚本,但它在具有高级用户权限的 Windows XP 中不起作用

@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%

set stamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%

xcopy "D:\secure" "D:\secure_bak\bak - %stamp%" /i

我收到如下错误

注册 mof 文件失败。 只有管​​理员组成员才能使用 WMIC.EXE。 原因:Win32 错误:访问被拒绝

请建议 WMIC.EXE 的替代方案,这样我也可以在 XP 中以 Power User 权限使用它。

提前感谢您的帮助。

问候,

【问题讨论】:

    标签: batch-file timestamp windows-xp xcopy


    【解决方案1】:

    此脚本为您提供可靠的变量,但在批处理文件中使用 VBS:

      :: date time using WSH/VBS
      :: datetime.bat V4.2
      ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
      ::
      :: This uses Windows Scripting Host to set variables to
      :: the current date/time/day/day_number/week_of_year etc
      :: for Win9x/ME/NT/W2K/XP/Vista/Win7/Win8 etc
      :: Thanks go to Todd Vargo for his scripting
      ::
      ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
      @echo off
      set TmpFile="%temp%.\tmp.vbs"
      echo> %TmpFile% n=Now
      echo>>%TmpFile% With WScript
      echo>>%TmpFile% .Echo "set m1="   + monthname(month(n), true)
      echo>>%TmpFile% .Echo "set m2="   + monthname(month(n), false)
      echo>>%TmpFile% .Echo "set woy="  + CStr(datepart("ww", n))
      echo>>%TmpFile% .Echo "set year=" + CStr(Year(n))
      echo>>%TmpFile% .Echo "set yr="   + Right(Year(n),2)
      echo>>%TmpFile% .Echo "set month="+ Right(100+Month(n),2)
      echo>>%TmpFile% .Echo "set day="  + Right(100+Day(n),2)
      echo>>%TmpFile% .Echo "set hour=" + Right(100+Hour(n),2)
      echo>>%TmpFile% .Echo "set min="  + Right(100+Minute(n),2)
      echo>>%TmpFile% .Echo "set sec="  + Right(100+Second(n),2)
      echo>>%TmpFile% .Echo "set dow="  + WeekDayName(Weekday(n),1)
      echo>>%TmpFile% .Echo "set dow2=" + WeekDayName(Weekday(n))
      echo>>%TmpFile% .Echo "set iso="  + CStr(1 + Int(n-2) mod 7)
      echo>>%TmpFile% .Echo "set iso2=" + CStr(Weekday(n,2))
      echo>>%TmpFile% End With
      cscript //nologo "%temp%.\tmp.vbs" > "%temp%.\tmp.bat"
      call "%temp%.\tmp.bat"
      del  "%temp%.\tmp.bat"
      del  %TmpFile%
      set TmpFile=
      set stamp=%year%-%month%-%day%.%hour%_%min%_%sec%
    
      if not "%~1"=="" goto :EOF
    
      echo The year  is "%year%" or "%yr%"
      echo The month is "%month%" "%m1%" "%m2%"
      echo The day   is "%day%" "%dow%" "%dow2%"
      echo.
      echo ISO8601 Day-Of-Week number is "%iso%" and week of year is: "%woy%"
    
      echo.
      echo The time in hh:mm:ss is "%hour%:%min%:%sec%"
      echo The hour   is "%hour%"
      echo The minute is "%min%"
      echo The second is "%sec%"
      echo.
    
      echo The date and time stamp is "%stamp%"
      echo.
      echo date A yyyymmdd "%year%%month%%day%"
      echo date B mmddyyyy "%month%%day%%year%"
      echo date C ddmmyyyy "%day%%month%%year%"
      echo date D yymmdd   "%yr%%month%%day%"
      echo date E mmddyy   "%month%%day%%yr%"
      echo date F ddmmyy   "%day%%month%%yr%"
      pause
      :: datetime.bat
      ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    

    【讨论】:

      【解决方案2】:

      我没有足够的评论声誉,这就是为什么我提出答案而不是评论。

      除了 Foxdrive 的回答。

      日期/时间提取代码是可重复使用的,那么我更喜欢将这些例程存储在单独的文件中,以便从其他批处理中调用。

      另外,最近我学到了有用的技术。

      这是我在 2008r2 下使用的真实批次的一部分:

      for /f %%a in ('wmic path win32_localtime get minute /format:list ^| findstr "="') do (set %%a)
      

      嗯,它使用了禁止的 WMIC,但我提到它是出于另一个原因。注意提取命令中的 (set %%a) 部分。带有 /format:list 的 WMIC 返回像 minute=57 这样的对列表,我们使用这些对作为 set 命令的参数,使 WMIC 的结果环境变量的名称。 人们可以将这种技术应用到 Foxdrive 的方法中。应该创建 .vbs 文件,生成类似的变量列表。

      rem GetDateTime.vbs
      rem Based on foxdrive//SE code
      n=Now
      With WScript
       .Echo "YYYY=" + CStr(Year(n))
       .Echo "MM="+ Right(100+Month(n),2)
       .Echo "DD="  + Right(100+Day(n),2)
       .Echo "HH=" + Right(100+Hour(n),2)
       .Echo "Min="  + Right(100+Minute(n),2)
       .Echo "Sec="  + Right(100+Second(n),2)
      End With
      

      然后,在主批处理中,我们使用 for 运算符(可能需要 .vbs 位置的路径):

      for /f %%a in ('cscript /nologo GetDateTime.vbs') do (set %%a)
      

      就是这样:在这个 for 之后,我们将根据需要设置六个变量。

      附:再次感谢 foxdrive 提供另一个提示:在需要时将 100 添加到小数字以添加前导零。我感到很惭愧,因为我使用了史前的 ifs 之类的

      if /i %month% lss 10 (
      set mon1=0%month%
      ) else (
      set mon1=%month%
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 2011-05-20
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多