2015-06-03 192 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

你不會錯過任何東西,並感謝你的幫助。你實際上已經解釋了你在上面做了哪些更詳細的工作,這正是我正在尋找的。我不知道如何批量部分將適合我當前的腳本。 –