2014-01-27 43 views
2

用下面的代碼,我遇到可怕的運行時間:爲什麼設置USER環境變量需要12秒?

Option Explicit 

Dim ShellEnvironment: Set ShellEnvironment=CreateObject ("WScript.Shell").Environment ("USER") 
Dim Name: Name="MyVar" 
Dim NewVal: NewVal="This is my value" 

Services.StartTransaction "SetEnv" 
ShellEnvironment (Name)=NewVal 
Services.EndTransaction ("SetEnv") 

請注意,只有服務*的東西是QTP特有的。這兩個語句生成以下運行結果條目,指示環境變量分配的運行時間:

Transaction "SetEnv" ended with "Pass" status (Total Duration: 12.1970 sec). 

這是一個非常快的機器。當然,這是一個不可接受的長運行時間。

根據Environment.SetEnvironmentVariable takes a long time to set a variable at User or Machine level,這是因爲所有頂級窗口都會通知1秒超時。我不確定這是否是C#專用的。那麼,它顯然不是。但我沒有看到我可以如何控制VBScript下的通知/超時過程。

所以一般來講,問題是:

如何設置在VBScript用戶環境變量沒有得到可怕的運行?

+1

同樣的問題在這裏:http://superuser.com/questions/565771/setting-user-environment-variables-is-very-slow在這種情況下,有一條評論指責Chrome。你可以不這樣做嗎?或者你需要在設置後立即執行依賴新變量的操作? – Xiaofu

+0

我對QTP沒有經驗,但我的第一步是通過在每條指令之前/之後回顯時間戳來確定哪條指令花費的時間太長。 –

+0

我可以忍受異步執行流程。但是 - 我如何在QTP/VBScript中做到這一點? – TheBlastOne

回答

0

似乎沒有辦法控制ShellEnvironment用於通知廣播的超時

所以我決定建立一個解決方法。使用Run

Option Explicit 

Dim Name 
Dim NewVal 

If WScript.Arguments.Count <> 2 then 
    WScript.Echo "setUSEREnv.vbs: Pass name and value of USER environment variable to set on the command line" 
    WScript.Quit (1) 
End If 

Name=CStr (WScript.Arguments.Item (0)) 
NewVal=CStr (WScript.Arguments.Item (1)) 

Dim ShellEnvironment: Set ShellEnvironment=CreateObject ("WScript.Shell").Environment ("USER") 
If ShellEnvironment (Name) <> NewVal then 
    ShellEnvironment (Name)=NewVal 
    WScript.Echo "Setting USER env var '" & Name & "'..." 
    WScript.Echo "USER env var '" & Name & "' set to '" & NewVal & "'" 
else 
    WScript.Echo "USER env var '" & Name & "' already is '" & NewVal & "'" 
End If 

從我SETENV功能代碼:

我把這個腳本

Dim ShellEnvironment: Set ShellEnvironment=CreateObject ("WScript.Shell").Environment ("USER") 

Dim Name: Name=EnvVarName 
If ShellEnvironment (Name) <> NewVal Then 
    Dim Shell: Set Shell=CreateObject ("WScript.Shell") 
    Shell.Run "cscript.exe ""c:\mydir\setUSERENV.vbs"" " & Name & " " & CStr (NewVal), 0, false 
End If 

這仍然侮辱我長的延遲爲每個的環境變量寫訪問,但至少主腳本繼續運行,所以我不必等待。

+0

沒有額外的答案,所以我會接受我自己的答案:\ – TheBlastOne