2015-06-03 194 views
0

我一直在写作一些批处理文件到我的桌面支持角色中。从批处理文件运行.VBS

我一直在编写一个配置文件备份脚本几个月,现在,随着角色需求和新问题的出现而变化。

我想从批处理文件中运行以下VBS脚本并将其输出指向另一个文件夹。

Set oNet= WScript.CreateObject("WScript.Network") 
Set oDrives = oNet.EnumNetworkDrives 
oUser = oNet.UserName 
Set oFilesys = CreateObject("Scripting.FileSystemObject") 
Set oFiletxt = oFilesys.CreateTextFile("Mapped_Network_Drives_"&oUser&".cmd", True) 
For i = 0 to oDrives.Count - 1 
oFiletxt.WriteLine "Net Use " & oDrives.Item(i) & " " & chr(34)& oDrives.Item(i+1) & chr(34) & " /persistent:yes" 
Next 
oFiletxt.Close 

此VBS脚本写了(不是我),以导出用户映射网络驱动器到使用netuse命令来重新映射一个CMD文件。

如果VBS脚本在批处理文件之外运行,那么它的工作正常,但是当它使用cscript等在批处理内运行时,它会创建输出文件Mapped_Network_Drives_%username%.cmd,但它是空。

REM pushes script to use batch file Drive Letter as working directory 
setlocal & pushd %~d0 
ECHO ============================= 
ECHO Creating Backup Folder 
ECHO ============================= 
MD "%UserName%_Backup" 
ECHO ============================= 
ECHO Backing Up Mapped Network Drives 
ECHO ============================= 
REM pushes script to use Backup Folder as working directory 
pushd "%~d0%UserName%_Backup" 
REM Runs VB script to backup Mapped Network Drives 
cscript //nologo "%~dp0Mapped_Network_Drives.vbs" 
pause 

以上是对我一直在使用的代码的剪切。

+0

对我的作品。提示:不要忘记在最后调用'popd'(两次)(以保持一致)。同样在我的机器上,我只有1个映射的网络驱动器'oDrives.Count'是2(抛出'下标超出范围',但也许我的WMI搞砸了)。底线,批处理运行创建'.cmd'文件。 – CristiFati

回答

0

与此

VBS部分尝试:在驱动器集合

Option Explicit 

Dim userName, drives 
    With WScript.CreateObject("WScript.Network") 
     userName = .UserName 
     Set drives = .EnumNetworkDrives 
    End With 

Dim drive 
    With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile("Mapped_Network_Drives_" & userName & ".cmd", True) 
     For drive = 0 To (drives.Count-1) Step 2 
      .WriteLine "net use " & drives.Item(drive) & " """ & drives.Item(drive+1) & """ /persistent:yes" 
     Next 
     .Close 
    End With 

批次部分修正迭代:确保所有路径引用得到妥善处理

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    call :getCurrentBatchFile _f0 
    for %%a in ("%_f0%") do (
     set "backupFolder=%%~da\%username%_Backup" 
     set "scriptsFolder=%%~dpa" 
    ) 

    md "%backupFolder%" 2>nul 
    pushd "%backupFolder%" && (
     cscript //nologo "%scriptsFolder%\Mapped_Network_Drives.vbs" 
     popd 
    ) || (
     echo Backup folder does not exist 
    ) 

    goto :eof 

:getCurrentBatchFile returnVar 
    set "%~1=%~f0" 
    goto :eof 
+0

@ScottSmith,你发布了一个带有问题的vbscript(主要是对驱动器列表的迭代),并且答案包括一个更正的版本。您在更改文件夹和/或驱动器时发布了带有非清除路径引用的批处理文件,当脚本与备份和当前文件夹不在同一个驱动器中时,'pushd“%〜d0%UserName%_Backup”'失败驱动器的根目录(和'%0'参考[不总是返回](http://stackoverflow.com/a/26851883/2861476)你期望的),答案包括一个更安全的版本。我错过了什么? –

+0

你不会错过任何东西,并感谢你的帮助。你实际上已经解释了你在上面做了哪些更详细的工作,这正是我正在寻找的。我不知道如何批量部分将适合我当前的脚本。 –