我正在考慮透過 GPO 建立一個在啟動時運行的批次檔。
該批次將安裝 TeamViewer 主機,因此我們可以將其部署給最終用戶,而無需他們輸入任何資訊。
該腳本旨在查看是否存在本地儲存的具有電腦名稱的文件,如果存在則停止。如果沒有,請刪除 Teamviewer 的所有痕跡並安裝我們擁有的主機版本,然後在本機上建立一個檔案來標記已安裝的正確版本。
當我們執行腳本時,控制台會給予錯誤「命令的語法不正確」。
請各位嚮導告訴我哪裡出錯了,因為我想像如果我可以毫無問題地運行批次文件,那麼 GPO 也應該能夠。
如果有更簡單或更簡潔的方法來執行此操作,請告訴我。
當我們在沒有 IF 的情況下運行腳本時,它可以正常工作。
if exist "C:\TeamViewer15\%computername%.jmw" (exit) else (
tasklist /FI "IMAGENAME eq TeamViewer.exe" 2>NUL | find /I /N "TeamViewer.exe">NUL
if "%ERRORLEVEL%"=="0" (GOTO :KILL) ELSE (GOTO :REMOVEMSI)
:KILL
taskkill /f /im TeamViewer.exe
TIMEOUT 2
GOTO :REMOVEMSI
:REMOVEMSI
wmic product where vendor="TeamViewer"
if not "%errorlevel%"=="0" GOTO :CHECKOS
for /f "tokens=2 delims==" %%f in ('wmic product Where "vendor like 'TeamViewer'" get IdentifyingNumber /value ^| find "="') do set "id=%%f"
msiexec.exe /x "%id%" /qn
GOTO :CHECKOS
:CHECKOS
cd\
Set "OS64=C:\Program Files (x86)"
IF EXIST "%OS64%" (GOTO :UNINSTALL64) ELSE (GOTO :UNINSTALL32)
:UNINSTALL64
cd\
Set "OLD64="C:\Program Files (x86)\TeamViewer\Version"*"
IF EXIST "%OLD64%" (GOTO :PREVIOUS64) ELSE (GOTO :REMOVE64)
:UNINSTALL32
cd\
Set "OLD32=C:\Program Files\TeamViewer\Version*"
IF EXIST "%OLD32%" (GOTO :PREVIOUS32) ELSE (GOTO :REMOVE32)
:PREVIOUS32
cd\
cd %ProgramFiles%\TeamViewer\Version*
IF NOT EXIST "*uninstall*" GOTO :REMOVE32
start uninstall.exe /S
GOTO :REMOVE32
:REMOVE32
cd\
cd %ProgramFiles%\TeamViewer
IF NOT EXIST "*uninstall*" GOTO :REMOVEFILES32
start uninstall.exe /S
GOTO :REMOVEFILES32
:REMOVEFILES32
reg delete "HKLM\Software\TeamViewer" /f
cd %temp%
rd TeamViewer /s /Q
GOTO :INSTALL
:PREVIOUS64
cd\
cd %ProgramFiles(x86)%\TeamViewer\Version*
IF NOT EXIST "*uninstall*" GOTO :REMOVE64
start uninstall.exe /S
GOTO :REMOVE64
:REMOVE64
cd\
cd %ProgramFiles(x86)%\TeamViewer
IF NOT EXIST "*uninstall*" GOTO :REMOVEFILES64
start uninstall.exe /S
GOTO :REMOVEFILES64
:REMOVEFILES64
reg delete "HKLM\Software\Wow6432Node\TeamViewer" /f
cd %temp%
rd TeamViewer /s /Q
REM INSTALL TEAM VIEWER HOST V15
start /wait msiexec.exe /i "\\DFSNAMESERVER\files\admin\Software Distribution\TeamViewer\TeamViewer_Host.msi" /qn CUSTOMCONFIGID=MYCUSTOMERCONFIGID APITOKEN=CUSTOMERAPITOKENKEY ASSIGNMENTOPTIONS="--reassign --alias %ComputerName% --grant-easy-access"
REM CREATE INSTALLATION MARKER
md C:\TeamViewer15
fsutil file createnew "C:\TeamViewer15\%computername%.jmw" 10
)
exit
我已經更改了該論壇的 TeamViewer 和伺服器詳細資訊(這些位元有效)
非常感謝湯姆
答案1
乍看之下(可能不完整):
- 絕不在指令區塊內使用
:label
nor:: label-like comment
括在()
括號中。 (1號線): 使用if exist "C:\TeamViewer15\%computername%.jmw" (exit)
而不是和刪除相應的右括號 (65號線,關鍵字之前的某處if exist "C:\TeamViewer15\%computername%.jmw" (exit) else (
exit
)。 start
命令(主要在61號線):始終包含一個標題例如作為start "" /wait msiexec.exe /i …
- 更多問題與
for /f "tokens=2 delims==" %%f in …
(12號線):
- 該
like
運算符需要在 WQL 查詢中使用通配符,請使用%%
; - 有(錯誤的)內撇號,請使用反引號
usebackq
替代引用風格而不是外部撇號,或使用類似的東西Where ^(vendor like "%%TeamViewer%%"^)
(注意使用^
抑揚音符號轉義括號) 代替;Where "vendor like 'TeamViewer'"
- 你可能會遇到WMIC尾隨
<CR>
問題。有關解決方案,請參閱 Dave Benham 的WMIC
和FOR /F
:解決拖尾<CR>
問題。