我正在研究通过 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%%"^)
(注意^
使用Circumflex Accent转义括号) 代替;Where "vendor like 'TeamViewer'"
- 你可能会遇到 WMIC尾随
<CR>
问题。有关解决方案,请参阅 Dave Benham 的WMIC
和FOR /F
:修复尾随<CR>
问题。