Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows IFs的批处理脚本问题?_Windows_Batch File - Fatal编程技术网

Windows IFs的批处理脚本问题?

Windows IFs的批处理脚本问题?,windows,batch-file,Windows,Batch File,我有这个脚本,但出于某种原因,我不断得到问题。其中一个问题是语法不正确。我重新运行了它,问题是不同的,但它说“N在这个时候是出乎意料的”,然后它有一行“if eq N”(“它坏了的地方”) 以下是脚本: SET LOG_FILE="D:\SmCpm\ElektronTMS\%PCN_NUM%_RollbackLog.txt" SET UNINSTALL5012=N SET UNINSTALL5013=N SET UNINSTALL5014=N SET UNINSTALL5015=N SET UN

我有这个脚本,但出于某种原因,我不断得到问题。其中一个问题是语法不正确。我重新运行了它,问题是不同的,但它说“N在这个时候是出乎意料的”,然后它有一行“if eq N”(“它坏了的地方”)

以下是脚本:

SET LOG_FILE="D:\SmCpm\ElektronTMS\%PCN_NUM%_RollbackLog.txt"
SET UNINSTALL5012=N
SET UNINSTALL5013=N
SET UNINSTALL5014=N
SET UNINSTALL5015=N
SET UNINSTALL5017=N
SET UNINSTALL5018=N
SET UNINSTALLV131=N
SET UNINSTALLV140=N
SET UNINSTALLV141=N
SET INST=""
SET ETMSFILENAME="ElektronTMS.msi"

:: *******************************************
:: Stop the SMF Service.

ECHO Rolling back installation of %PCN_NUM%

net stop smf
ping 127.0.0.1 -n 5 > nul



:: *******************************************
:: determine which PCNs need to be uninstalled.

FOR /F "tokens=2*" %%A IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\Reuters\TMS" /v PCN5021') DO (

    set INST=%%B
)

if not x%INST:5012=%==x%INST% (
    SET UNINSTALL5012=Y
)
if not x%INST:5013=%==x%INST% (
    SET UNINSTALL5013=Y
)
if not x%INST:5014=%==x%INST% (
    SET UNINSTALL5014=Y
)
if not x%INST:5015=%==x%INST% (
    SET UNINSTALL5015=Y
)
if not x%INST:5017=%==x%INST% (
    SET UNINSTALL5017=Y
)
if not x%INST:5018=%==x%INST% (
    SET UNINSTALL5018=Y
)
if not x%INST:V131=%==x%INST% (
    SET UNINSTALLV131=Y
)
if not x%INST:V140=%==x%INST% (
    SET UNINSTALLV140=Y
)
if not x%INST:V141=%==x%INST% (
    SET UNINSTALLV141=Y
)


:: ***********************
:: Uninstall the packages.

ECHO Rolling back patch

IF %UNINSTALLV131% EQU Y (
    FOR /F "tokens=3*" %%C IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\48AB8A7CAE88C33488B5F1498871520C\InstallProperties /v LocalPackage') DO (
        SET LOCALPACKAGE=%%C
    )

    FOR /F "tokens=3*" %%S IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\48AB8A7CAE88C33488B5F1498871520C\InstallProperties /v InstallSource') DO (
        SET SOURCEINSTALL=%%S
    )

    if not exist %SOURCEINSTALL% (
        md "%SOURCEINSTALL%"
        SET SOURCEEXISTS=N
    )

    if exist %SOURCEINSTALL% (
        SET SOURCEEXISTS=Y
    )
    SET COPYTODIR=%SOURCEINSTALL%%ETMSFILENAME%

    copy /y %LOCALPACKAGE% %COPYTODIR%

    msiexec -package {C7A8BA84-88EA-433C-885B-1F94881725C0} -uninstall {F732939E-ED57-43FC-B298-83F933E1F950} -quiet -norestart -lv+ %LOG_FILE%
    ping 127.0.0.1 -n 5 > nul

    if %SOURCEEXISTS% EQU N (
        rd /s /q "%SOURCEINSTALL%"
    ) else (
        del /F %COPYTODIR%
    )
)
IF %UNINSTALLV140% EQU Y (
    FOR /F "tokens=3*" %%C IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\98AF25D0FB734FC4BA465843970476B6\InstallProperties /v LocalPackage') DO (
        SET LOCALPACKAGE=%%C
    )

    FOR /F "tokens=3*" %%S IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\98AF25D0FB734FC4BA465843970476B6\InstallProperties /v InstallSource') DO (
        SET SOURCEINSTALL=%%S
    )   
    if not exist %SOURCEINSTALL% (
        md "%SOURCEINSTALL%"
        SET SOURCEEXISTS=N
    )

    if exist %SOURCEINSTALL% (
        SET SOURCEEXISTS=Y
    )
    SET COPYTODIR=%SOURCEINSTALL%%ETMSFILENAME%

    copy /y %LOCALPACKAGE% %COPYTODIR%

    msiexec -package {0D52FA89-37BF-4CF4-AB64-85347940676B} -uninstall {C845F8AE-6935-42D9-AE8C-2564E2A82C71} -quiet -norestart -lv+ %LOG_FILE%
    ping 127.0.0.1 -n 5 > nul

    if %SOURCEEXISTS% EQU N (
        rd /s /q "%SOURCEINSTALL%"
    ) else (
        del /F %COPYTODIR%
    )
)
IF %UNINSTALLV141% EQU Y (
    FOR /F "tokens=3*" %%C IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\DFFF30F7568D1D144B5B7B785F32638D\InstallProperties /v LocalPackage') DO (
        SET LOCALPACKAGE=%%C
    )

    echo %LOCALPACKAGE%

    FOR /F "tokens=3*" %%S IN ('c:\windows\system32\reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\DFFF30F7568D1D144B5B7B785F32638D\InstallProperties /v InstallSource') DO (
        SET SOURCEINSTALL=%%S
    )   

    if not exist %SOURCEINSTALL% (
        md "%SOURCEINSTALL%"
        SET SOURCEEXISTS=N
    )

    if exist %SOURCEINSTALL% (
        SET SOURCEEXISTS=Y
    )
    SET COPYTODIR=%SOURCEINSTALL%%ETMSFILENAME%

    copy /y %LOCALPACKAGE% %COPYTODIR%

    msiexec -package {7F03FFFD-D865-41D1-B4B5-B787F52336D8} -uninstall {464FBA62-6FA9-4744-BDA7-68284B61B6DB} -quiet -norestart -lv+ %LOG_FILE%
    ping 127.0.0.1 -n 5 > nul       

    if %SOURCEEXISTS% EQU Y (
        rd /s /q "%SOURCEINSTALL%"
    ) else (
        del /F %COPYTODIR%
    )
)
我已经查询了所有注册表值的详细信息,我可以看到有一个源安装值和一个本地包值。起初,它抱怨我的“if not exist”出现语法错误,但现在我得到了另一个错误,我不知道我的批处理出了什么问题

有人能帮忙吗


多亏了

,所提供的批处理代码可以通过使用子例程来简化,这也避免了使用延迟扩展的需要

@ECHO OFF
SETLOCAL
SET "LOG_FILE=D:\SmCpm\ElektronTMS\%PCN_NUM%_RollbackLog.txt"
SET "UNINSTALL5012=N"
SET "UNINSTALL5013=N"
SET "UNINSTALL5014=N"
SET "UNINSTALL5015=N"
SET "UNINSTALL5017=N"
SET "UNINSTALL5018=N"
SET "UNINSTALLV131=N"
SET "UNINSTALLV140=N"
SET "UNINSTALLV141=N"
SET "INST=x"
SET "ETMSFILENAME=ElektronTMS.msi"

:: *******************************************
:: Stop the SMF Service.

ECHO Rolling back installation of %PCN_NUM%

%SystemRoot%\System32\net.exe stop smf
REM %SystemRoot%\System32\ping.exe 127.0.0.1 -n 5 > nul


:: *******************************************
:: determine which PCNs need to be uninstalled.

FOR /F "tokens=2*" %%A IN ('%SystemRoot%\System32\reg.exe QUERY "HKLM\SOFTWARE\Wow6432Node\Reuters\TMS" /v PCN5021 2^>nul') DO SET "INST=%%B"

IF NOT "%INST:5012=%" == "%INST%" SET "UNINSTALL5012=Y"
IF NOT "%INST:5013=%" == "%INST%" SET "UNINSTALL5013=Y"
IF NOT "%INST:5014=%" == "%INST%" SET "UNINSTALL5014=Y"
IF NOT "%INST:5015=%" == "%INST%" SET "UNINSTALL5015=Y"
IF NOT "%INST:5017=%" == "%INST%" SET "UNINSTALL5017=Y"
IF NOT "%INST:5018=%" == "%INST%" SET "UNINSTALL5018=Y"
IF NOT "%INST:5019=%" == "%INST%" SET "UNINSTALL5019=Y"
IF NOT "%INST:V131=%" == "%INST%" SET "UNINSTALLV131=Y"
IF NOT "%INST:V140=%" == "%INST%" SET "UNINSTALLV140=Y"
IF NOT "%INST:V141=%" == "%INST%" SET "UNINSTALLV141=Y"


:: ***********************
:: Uninstall the packages.

ECHO Rolling back patch

IF %UNINSTALLV131% == Y CALL :UnInstallPatch "48AB8A7CAE88C33488B5F1498871520C" "C7A8BA84-88EA-433C-885B-1F94881725C0" "F732939E-ED57-43FC-B298-83F933E1F950"
IF %UNINSTALLV140% == Y CALL :UnInstallPatch "98AF25D0FB734FC4BA465843970476B6" "0D52FA89-37BF-4CF4-AB64-85347940676B" "C845F8AE-6935-42D9-AE8C-2564E2A82C71"
IF %UNINSTALLV141% == Y CALL :UnInstallPatch "DFFF30F7568D1D144B5B7B785F32638D" "7F03FFFD-D865-41D1-B4B5-B787F52336D8" "464FBA62-6FA9-4744-BDA7-68284B61B6DB"

ENDLOCAL
GOTO :EOF


:: *********************************
:: Subfunction to uninstall a patch.

:UnInstallPatch
set "ProductID=%~1"
set "PackageID=%~2"
set "UninstallID=%~3"

FOR /F "tokens=3*" %%C IN ('%SystemRoot%\System32\reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\%ProductID%\InstallProperties /v LocalPackage') DO SET "LOCALPACKAGE=%%~C"
FOR /F "tokens=3*" %%S IN ('%SystemRoot%\System32\reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\%ProductID%\InstallProperties /v InstallSource') DO  SET "SOURCEINSTALL=%%~S"

MD "%SOURCEINSTALL%" 2>nul
IF EXIST "%SOURCEINSTALL%" ( SET "SOURCEEXISTS=Y" ) ELSE ( SET "SOURCEEXISTS=N" )

SET "COPYTODIR=%SOURCEINSTALL%%ETMSFILENAME%"

COPY /Y "%LOCALPACKAGE%" "%COPYTODIR%"

START "" /WAIT %SystemRoot%\System32\msiexec.exe -package {%PackageID%} -uninstall {%UninstallID%} -quiet -norestart -lv+ "%LOG_FILE%"
REM %SystemRoot%\System32\ping.exe 127.0.0.1 -n 5 > nul

IF %SOURCEEXISTS% == Y (
    RD /S /Q "%SOURCEINSTALL%"
) ELSE (
    DEL /F "%COPYTODIR%"
)

GOTO :EOF
还可以查看答案,了解使用的原因

set "variable=value"
而不是

set variable=value

好的,包含引号的变量
LOG\u文件
被正确设置和使用,但不包括包含引号的变量
ETMSFILENAME
,并与变量
SOURCEINSTALL
的值连接


我认为在处理继续之前,ping执行等待5秒是没有必要的,这就是注释它们的原因。但这没有被我验证。

似乎,你不知道。嗨,Stephen。我应该使用!而不是%来表示我的所有变量吗?或者我可以使用%来表示吗?使用
!var!
用于您希望能够从脚本中更改(并测试更改)的变量。您还应该具有
setlocal enabledelayedexpansion
您还应该使用
eq
进行数值比较,使用
=
进行字符串比较。请注意,使用
%var%”==“somestring”也更好
使用双引号,否则带空格的字符串将阻止您的代码。谢谢。这看起来棒极了-我会仔细研究一下!
set variable="value"