Windows 运行7zip安装程序后,静默安装7zip的批处理脚本不会继续

Windows 运行7zip安装程序后,静默安装7zip的批处理脚本不会继续,windows,batch-file,command-line,Windows,Batch File,Command Line,我正在尝试创建一个脚本,该脚本以静默方式运行多个setup.exe,无论出于何种原因,当我在批处理文件中以静默方式完成7zip的安装后,不会再执行其他命令 我有点不知所措。我尝试过暂停、回显,以及其他只是回显的子例程(返回后工作并执行命令) 但无论出于何种原因,在我执行7zip.exe/S之后,即使从安装它的子例程返回,它也会停止执行命令 @echo OFF SET 7ZipName=7z*.exe SET x86SetupFilePath=C:\PSDARS-Setup\x86\ SET

我正在尝试创建一个脚本,该脚本以静默方式运行多个setup.exe,无论出于何种原因,当我在批处理文件中以静默方式完成7zip的安装后,不会再执行其他命令

我有点不知所措。我尝试过暂停、回显,以及其他只是回显的子例程(返回后工作并执行命令)

但无论出于何种原因,在我执行7zip.exe/S之后,即使从安装它的子例程返回,它也会停止执行命令

@echo OFF


SET 7ZipName=7z*.exe

SET x86SetupFilePath=C:\PSDARS-Setup\x86\
SET x64SetupFilePath=C:\PSDARS-Setup\x64\

SET x647ZipPath=C:\Program Files\7-Zip\
SET x867ZipPath=C:\Program Files (x86)\7-Zip\

:: 1. Check for OS architecture
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT

if %OS%==32BIT GOTO :32BIT

if %OS%==64BIT GOTO :64BIT

:32BIT

:: Check arguments 1 = Installation Directory Path. If not set use base above 
IF NOT %1.==. SET x86SetupFilePath=%~1

::Install 7zip
CALL :Install7Zip 

setx PATH "%PATH%;%x647ZipPath%" /m

GOTO :ProgramEnd


:64BIT

:: Check arguments 1 = Installation Directory Path 
IF NOT %1.==. SET x64SetupFilePath=%~1

::Install 7zip
CALL :Install7Zip 

CALL :Test

Echo 7zip Installation Complete

::setx PATH "%PATH%;%x647ZipPath%" /m

GOTO :ProgramEnd

:Test
Echo a
GOTO :EOF

:: Author: Jacob Howarth
:: Date: 07/20/18
:: Description: This procedure will install the correct version of
:: the 7zip installer silent based on the architecture of the OS
::
:Install7Zip
IF %OS%==32BIT cd "%x86SetupFilePath%"

IF %OS%==64BIT cd "%x64SetupFilePath%"

for %%f in (%7ZipName%) do SET File=%~f     

%File% /S

ECHO.%ERRORLEVEL%

GOTO :EOF
:: End of Install7Zip

echo 7zip Installation Complete

:ErrorInstall7Zip
echo Error installing 7zip for %OS% OS. x64 path = %x64SetupFilePath%, x86 path =%x86SetupFilePath%.

:ProgramEnd
重新构造代码以删除goto

检查操作系统体系结构的
程序文件(x86)

命令
setx
对于简单变量来说是可以的,但是
PATH
变量,需要更多代码来检查该值 并仅在需要时添加到现有值。 注意事项,如注册表值类型和可能的变量 在中,可能需要检查该值。reg导出文件是 在添加更改之前创建为备份

使用不以数字开头的用户变量名。这个 原因是可能会出现诸如
%7ZipName%
之类的名称 解释为
%7
ZipName%
%7
是第一个有效的 扩展作为第七个论点。这可能会导致语法错误 错误

使用x64操作系统进行测试。操作系统环境可能需要重新启动才能运行 更新更改或运行系统属性Advanced(高级)并单击 环境变量,然后确定两次
更新。

我能看到的每个代码路径都以
转到:ProgramEnd
结束,在
:ProgramEnd
之后无需执行任何操作。你期望会发生什么呢?为什么要检查CPU的位数?32位操作系统可以安装在64位CPU上。如果代码:SET File=%~f,则此行缺少百分比符号。也不要以数字开头变量名。它可以被看作是一个命令行参数。命令行
setx路径“%PATH%”;%x647ZipPath%”/m
是绝对不允许的-永远不允许。由于各种原因,您正在使用该命令行损坏系统环境变量
PATH
。例如,参见或。实际上,没有必要将7-Zip程序文件路径添加到系统
path
,否则7-Zip安装程序就会这样做。我很欣赏这些建设性的更改,但这些都不能真正回答为什么它在执行7zip安装程序后不执行任何命令的问题@Mofi 7zip显然不会添加到任何path变量系统中,或者在静默安装时添加到其他系统中。我查过了,没看到。我会检查一下,看看它是否与导致错误或其他事情的for变量有关。在安装7Zip之后,您如何让它执行?我甚至无法在之后执行echo,所以我很困惑
echo 7zip安装完成
是如何工作的,因为在这一点上没有什么不同。是因为我没有执行setlocal?在你的源代码中,
%7
毒害了
for
循环,而
echo
转到:eof
之后,所以它实际上会转到文件末尾并完成脚本。对for循环的理解还可以。然而,这是否意味着这个网站上的部分关于呼叫是错误的?它表示您可以在例程结束时使用
GOTO:EOF
来完成
exit/b
GOTO:EOF
exit/b
具有相似的行为,因此可以互换。在您的源代码中,您调用
:Install7Zip
,它将向下转到
goto:eof
,然后返回到调用方线路。
:64位
标签有回声,而
:32位
标签没有回声。
reg查询
可能已将
转到
:32位
标签。
@echo off
setlocal

:: Check for OS architecture.
set "SetupFilePath=%~1"

if not defined SetupFilePath (
    if defined ProgramFiles(x86^) (
        set "SetupFilePath=C:\PSDARS-Setup\x86"
    ) else (
        set "SetupFilePath=C:\PSDARS-Setup\x64"
    )
)

:: Change working directory.
cd /d "%SetupFilePath%" || (
    >&2 echo Failed to change directory.
    exit /b 1
)

:: Get setup file name.
set "SevenZipName=7z*.exe"
set "File="

for %%F in ("%SevenZipName%") do set "File=%%~F"

if not defined File (
    >&2 echo File not defined.
    exit /b 1
)

:: Install 7zip.
"%File%" /S

if errorlevel 1 (
    >&2 echo 7zip errorlevel: %errorlevel%
    exit /b 1
)

:: Add to PATH environment variable.
set "SevenZipPath=%ProgramFiles%\7-Zip"

if exist "%SevenZipPath%" (
    call :add_path "%SevenZipPath%" "%%ProgramFiles%%\7-Zip"
)

echo 7zip Installation Complete
exit /b 0


:add_path
set "main_key=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set "data="

:: Query the HKLM Path and get the key name, data type and data.
for /f "tokens=1,2,*" %%A in ('reg query "%main_key%" /v Path') do (
    if /i "%%~A" == "Path" (
        set "key_name=%%~A"
        set "data_type=%%~B"
        set "data=%%~C"
    )
)

if not defined data (
    >&2 echo Path data for write to registry is undefined.
    exit /b 1
)

:: Remove trailing semi-colon.
if "%data:~-1%" == ";" set "data=%data:~,-1%"

:: Check target is already in Path.
for %%A in ("%data:;=" "%") do for %%B in ("%~1" "%~2") do (
    if "%%~A" == "%%~B" (
        echo Directory "%%~B" is in Path.
        exit /b 0
    )
)

:: Set new_data to a value to suit data type.
if /i "%data_type%" == "REG_EXPAND_SZ" (
    set "new_data=%~2"
) else set "new_data=%~1"

if not defined new_data (
    >&2 echo Path new_data to write to registry is undefined.
    exit /b 1
)

:: Remove trailing backslash.
if "%new_data:~-1%" == "\" set "new_data=%data:~,-1%"

:: Backup and update Path.
if not exist "%~dp0Environment_Backup.reg" (
    echo Backing up key to Environment_Backup.reg.
    reg export "%main_key%" "%~dp0Environment_Backup.reg"
)

echo Adding "%new_data%" to Path.
>nul reg add "%main_key%" /v "Path" /t "%data_type%" /d "%data%;%new_data%" /f
exit /b 0