我有一個非常煩人的問題,這是公司政策的結果——即用戶無法編輯他們的路徑。現在我想通過 VBA 來更改 USER 路徑,但只有一個問題 - 所有安裝都在 SYSTEM 環境變數中:%USERPROFILE%\AppData\Local\Microsoft\WindowsApps
因此,腳本會話的 PATH 將采用 SYSTEM 路徑并將 USER 路徑附加到它。非常正常的 Windows 行為。我在設定路徑后遇到的問題是 ORDER 導致問題。WindowsApps 將 Python 作為安裝包,所以如果它在 PATH 陳述句中首先出現,在某些 PC 上它會嘗試加載 Python 安裝,而不是用戶安裝的 Python(!)煩人,對吧?是的,我從它的安裝目錄呼叫 Python,所以我不確定問題到底是什么。
現在我擁有開發者權利,所以我基本上可以 100% 控制我的筆記本電腦。但我的最終用戶不這樣做。如果沒有公司鎖定,我只會讓用戶WindowsApps從他們的系統路徑中洗掉...
正常的完整目錄路徑是這樣的:
%USERPROFILE%\Anaconda3\;
%USERPROFILE%\Anaconda3\Library;
%USERPROFILE%\Anaconda3\Library\bin;
%USERPROFILE%\Anaconda3\Scripts\;
當前代碼非常簡單:
Sub RunPythonScript()
Dim objShell As Object
Dim PythonExePath, PythonScript As String
Set objShell = VBA.CreateObject("Wscript.Shell")
Dim WaitOnReturn As Boolean
Dim WindowStyle As Integer
WindowStyle = 1
WaitOnReturn = True
' find the Python Path in the workbook
PythonPath_Row = ThisWorkbook.Sheets(ActiveSheet.Name).Columns(1).Find(What:="Python Path", LookIn:=xlValues).Row 1
PythonPath = ThisWorkbook.Sheets(ActiveSheet.Name).Cells(PythonPath_Row, 1)
' set only the User environment settings since no admin permission required
Set colUserEnvVars = objShell.Environment("User")
' save the original PATH
originalPATH = colUserEnvVars.Item("Path")
' add the needed Python directories to the PATH
colUserEnvVars.Item("PATH") = PythonPath & ";" & PythonPath & "Library" & ";" & PythonPath & "Library\bin" & ";" & PythonPath & "Scripts" & ";" & colUserEnvVars.Item("Path")
PythonScript = """" & ThisWorkbook.Path & "\MyScript.py" & """"
PythonEXE = PythonPath & "python.exe"
' run Python script
objShell.Run PythonEXE & " " & PythonScript, WindowStyle, WaitOnReturn
' put path back to normal
colUserEnvVars.Item("PATH") = originalPATH
End Sub
對我來說沒有任何意義的是,我正在從它的安裝目錄中顯式呼叫 Python!那么為什么有些 PC 仍然從 WindowsApps 中打開 Python ???我單步執行 VBA 代碼并驗證傳遞給 shell 的命令列是否正確。我在設定路徑后打開了一個 CMD 提示符,并且全部正確修改。我只是對為什么這對每個人都不起作用感到困惑。如果有人了解問題可能是什么,請告訴我。
uj5u.com熱心網友回復:
請嘗試下一個函式來獲取打開特定擴展的任何(已安裝)應用程式的安裝路徑(默認):
Private Function GetExePath(ext As String) As String
Dim strAppl As String, strPathExe As String, strExeFile As String
Dim WSHShell As Object
Set WSHShell = CreateObject("WScript.Shell")
On Error Resume Next
strAppl = WSHShell.RegRead("HKEY_CLASSES_ROOT\" & WSHShell.RegRead("HKEY_CLASSES_ROOT\" & ext & "\") & _
"\shell\open\command\")
If err.Number <> 0 Then
err.Clear: On Error GoTo 0
GetExePath = ""
MsgBox "No program installed for extension """ & ext & """"
Exit Function
End If
On Error GoTo 0
strExeFile = Split(strAppl, """ """)(0)
strExeFile = Right(strExeFile, Len(strExeFile) - 1)
GetExePath = strExeFile
End Function
您可以通過以下方式對其進行測驗:
Private Sub testGetExeP()
Debug.Print GetExePath(".xls")
Debug.Print GetExePath(".pdf")
Debug.Print GetExePath(".py")
End Sub
請嘗試將使用過的作業簿中的路徑與回傳的 exe 路徑進行比較。首先,檢查我的假設(來自上述評論)是否得到確認,其次使用該函式而不是從任何作業簿中提取的路徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/451406.html
