2015-04-03 46 views
1

我正在爲Windows安裝一個selenium服務的腳本,該服務還設置了鉻和驅動程序的路徑,但每次腳本運行時只設置它們(如果有什麼更新)最終會一遍又一遍地追加相同的變量。 我嘗試這樣做:蝙蝠文件設置附加到PATH如果PATH不包含位置

setx IEDRIVER "%~dp0..\ie" /m 
setx CHROMEDRIVER "%~dp0..\chrome" /m 
if not x%PATH:IEDRIVER=%==x%PATH% setx path "%PATH%IEDRIVER;" /m 
if not x%PATH:CHROMEDRIVER=%==x%PATH% setx path "%PATH%CHROMEDRIVER;" /m 

,但我得到的錯誤:

C:\Windows was unexpected at this time. 

的最終目標是要檢查,看是否有變量是路徑,如果沒有設置該變量。

回答

3

部分問題是%PATH%包含空格。如果if語句中比較運算符的任一側可能包含空格,則應引用兩個參數。

if not "%PATH:substr=repl%"=="%PATH%" do stuff.... 

接下來,你要提供一個變量作爲子到另一個變量。當你這樣做時,你需要延遲外部變量的擴展。

setlocal enabledelayedexpansion 
if not "!PATH:%IEDRIVER%=!"=="!PATH!" do stuff.... 
endlocal 

現在。而不是檢查PATH中是否存在絕對路徑,最好檢查一下您的ie和chrome目錄中的某個文件是否可以訪問PATH。您可以使用for變量擴展語法來執行此操作。

for %%I in (ie chrome) do set %%I= 
for %%I in (fileInIE.ext) do set "ie=%%~$PATH:I" 
for %%I in (fileInChrome.ext) do set "chrome=%%~$PATH:I" 
if defined ie.... 
if defined chrome... 

但最大的問題是使用setx修改%PATH%是破壞性的,應該避免。包含PATH的註冊表值有意使用未擴展的變量,並保存在可在運行時擴展它們的數據類型中。使用setx將它們擴展得太早。如果要以編程方式修改路徑,最好直接修改註冊表。這並不容易,但破壞性較小。

@echo off 
setlocal 

for %%I in ("%~dp0..\ie") do set "IEDRIVER=%%~fI" 
for %%I in ("%~dp0..\chrome") do set "CHROMEDRIVER=%%~fI" 
for %%I in (ie chrome) do set %%I= 
for %%I in (fileInIE.ext) do set "ie=%%~$PATH:I" 
for %%I in (fileInChrome.ext) do set "chrome=%%~$PATH:I" 

if not defined ie call :append_path "%IEDRIVER%" 
if not defined chrome call :append_path "%CHROMEDRIVER%" 

goto :EOF 

:append_path <val> 
set "env=HKLM\System\CurrentControlSet\Control\Session Manager\Environment" 
for /f "tokens=2*" %%I in ('reg query "%env%" /v Path ^| find /i "REG_EXPAND_SZ"') do (

    rem // make addition persistent through reboots 
    reg add "%env%" /f /v Path /t REG_EXPAND_SZ /d "%%J;%~1" 

    rem // apply change to the current process 
    for %%a in ("%%J;%~1") do (path %%~a) 
) 

rem // use setx to set a temporary throwaway value to trigger a WM_SETTINGCHANGE 
rem // applies change to new console windows without requiring a reboot 
(setx /m foo bar & reg delete "%env%" /f /v foo) >NUL 2>NUL 

color 4E 
echo Warning: %%PATH%% has changed. Reopen the console to inherit the changes. 

goto :EOF 
+0

優秀的答案!但是,'設置'IEDRIVER =%〜dp0 .. \ ie「'結果到'fullScriptPath \ .. \ ie'從字面上看。這個'\ .. \'(即明顯的_parent文件夾_)將如何在'path'環境變量中解析?無論如何,這似乎是一個醜陋的東西......我會用'set'batDir =%〜dp0「''&'設置」batDir =%batDir:〜0,-1%「''' %% g in(「%batDir%」)設置爲「Parent = %%〜dpG」&'set「IEDRIVER =%Parent%ie」' – JosefZ 2015-04-03 21:43:16

+1

或'for %% I in(「%〜dp0 .. \即「)確定」IEDRIVER = %%〜fI「也可以。我的目的更多的是教導而不是解決問題,而且我不想讓腳本完全無法識別OP。無論如何,我想我的答案結束了。我會根據你的建議修復'..'部分。 – rojo 2015-04-04 01:21:20

+0

完美匹配'%%〜fI',因爲您實際上不需要_parent folder_。然而,我已經在'path'裏測試了這個令人討厭的'\ .. \',它運行得很好...... – JosefZ 2015-04-04 12:11:29

0

Setx拒絕將現有路徑添加到路徑。