2014-12-28 56 views
0

我使用批處理在每個客戶端本地執行一個robocopy命令,同步一個文件夾,然後啓動一個具有自己的模式批處理的應用程序。如何使用批處理命令「where」並從VBScript設置變量?

我的下一個項目是在VBScript中轉換此批處理,直接從遠程共享文件夾使用它,而不是將批處理存儲在每個客戶端本地。

即使我不是一個好的VBScript程序員,在指標上,我幾乎已經設置好了,但我堅持要將where命令移植到VBScript。

在我的批處理文件,我執行以下命令:

FOR /F "tokens=* USEBACKQ" %%F IN (`where /R C:\appfolder startapp.bat /F`) DO (
    SET strAPP=%%F 
) 

C:\appfolder有安裝在每個客戶端軟件,並出於某些原因,可安裝在錯誤的和不同的模式,從而使公共startapp.bat可能每個客戶都有不同的模式。由於這個原因,上面的FOR實例幫助我創建一個名爲%strapp%的變量,稍後在批處理中使用該變量來啓動應用程序。

現在,我的VBScript正在使用確切的模式,但沒有這個「在哪裏命令預防」,我想擁有與批處理相同的功能,只是爲了防止將來客戶端可能會再次出現錯誤的安裝在一個非常見的模式。

例如在使用strmsg菜單,當從它的客戶端的用戶選擇正確的選項VBS,VBScript的啓動應用程序:

objShell.Run("%comspec% /K C:\appfolder\startapp.bat & exit"), 1, True 

strFlag = True 

和它的作品,我試圖添加老where命令,並設置一個變量中添加&每個連接命令,所有那些在一行中沒有運氣....

eg

objShell.Run("%comspec% /K FOR /F "tokens=* USEBACKQ" %%F IN (`where /R C:\appfolder startapp.bat /F`) DO (SET strAPP=%%F) & %strapp% & exit"), 1, True 

strFlag = True 

我試圖用雙引號「」,沒有運氣。

回答

1

一個VBScript實現where看起來是這樣的:

Function Where(fldr, filename) 
    For Each f In fldr.Files 
    If LCase(f.Name) = LCase(filename) Then 
     Where = f.Path 
     Exit Function 
    End If 
    Next 

    For Each sf In fldr.SubFolders 
    Where = Where(sf, filename) 
    If Not IsEmpty(Where) Then Exit Function 
    Next 
End Function 

的功能將被稱爲像這樣:

Set fso = CreateObject("Scripting.FileSystemObject") 

strAPP = Where(fso.GetFolder("C:\appfolder"), "startapp.bat") 

Set objShell = CreateObject("WScript.Shell") 
objShell.Run "%comspec% /c """ & strAPP & """", 1, True 

作爲一個側面說明,這是毫無意義與選項/k(K開始CMD實例eep窗口),無論如何你要退出。從選項/c(關閉窗口)開始,並刪除exit聲明。

按照下文安斯加爾建議,添加方法參數0,CMD窗口隱藏

objShell.Run "%comspec% /c """ & strAPP & """", 0, True 
+0

正確**複製和使用**,@ Ansgar的方法只是'有效'。 –

+0

它的工作原理,但它真的很慢尋找正確的模式,此外,它保持背景的dos框,我想使用Ansgar一個,但怎麼可以改進? 我認爲它與應用程序有關,而不是順便說一下「where命令」,此刻我不知道該如何感謝你們兩個,並且我將兩個腳本並行使用,我稍後再決定哪一個是可靠的。 我想也張貼整個腳本是否可以爲社區(我想不會是有用的,由於我不是一個好的程序員) :-) 謝謝你有用! – xer

+0

@xer將「Run」方法的第二個參數更改爲0以隱藏CMD窗口。除非你在搜索UNC路徑或廣泛的文件夾樹,否則'Where'函數應該足夠快。 –

0

找到一些錯誤:

  • 擴大%comspec% ...沒必要(感謝安斯加爾Wiechers'評論),它只是在VBScript中的環境變量的我毫無根據的和過度猜疑的一個方面.. 。偏執狂是正確的術語,我認爲:)
  • "報價應加倍
  • 參數名稱是命令行%F;加倍%百分號(%%F)中只有一批
  • /V:ON啓用延時環境變量擴展使用!作爲分隔符。例如,/ V:ON將允許!var!在執行時擴展變量var。 %var%語法擴展了輸入(解析)時的變量,這在FOR循環內部以及&級聯命令行中完全不同。
  • usebackq:丟失(`where)中的後引號。 ..`)做...
  • 新增!&echo !strapp!&pause之前&exit。通過這種方式,您可以在調試時看到結果...

忘記了什麼?然而,所有的VBScript如下:

option explicit 
Dim strResult: strResult=Wscript.ScriptName 

Dim WshShell: Set WshShell = WScript.CreateObject("WScript.Shell") 
Dim cmd, retrn, params 
cmd = WshShell.ExpandEnvironmentStrings("%comspec%") 
params = " /E:ON /V:ON /K FOR /F ""USEBACKQ tokens=*"" %F IN (`where /R C:\appfolder startapp.bat /F`) DO (SET strAPP=%F)&!strapp!&echo !strapp!&pause&exit" 
retrn = WshShell.Run(cmd & params, 1, true) 

strResult = strResult & vbNewline & cmd 
strResult = strResult & vbNewline & params 
strResult = strResult & vbNewline & retrn 

Wscript.Echo strResult 
Wscript.Quit 

@JosefZ

謝謝您的回答,即使我喜歡安斯加爾的解決方案,我做你的工作,我想它張貼在這裏,以防萬一是有用爲別人。 最後,用你的修訂是工作的VBScript(對我來說),其中的命令是這樣的一個:

option explicit 
Dim strResult: strResult=Wscript.ScriptName 

Dim WshShell: Set WshShell = WScript.CreateObject("WScript.Shell") 
Dim cmd, retrn, params 
cmd = WshShell.ExpandEnvironmentStrings("%comspec% /C") 
params = "FOR /F ""tokens=* USEBACKQ"" %F IN (`where /R C:\appfolder startapp.bat /F`) DO (SET strAPP=%F) & cmd /C %strapp%" 
retrn = WshShell.Run(cmd & params, 1, true) 
Wscript.Quit 
+0

的'Run'方法由本身膨脹的環境變量。首先不需要擴展'%comspec%'。 –

+0

@xer如果您在腳本中使用了此方法,則應將此標記爲[接受的答案](http://meta.stackoverflow.com/a/5235)而不是我的。 –

+0

@Ansgar好吧,明白了,我只是用於stackoverflow的newbee只是想讓我知道我也注意到了這個 – xer

相關問題