Start Excel-fil fra Windows-batch script i safemode, brug standard filforening

Indlæg af Hanne Mølgaard Plasc

Problem



Spørgsmålssammendrag:
Kan jeg starte Excel-filen Installer.xlsm fra Windows-batch script i safemode uden at give EXCEL.EXE installationssti?


Detaljer


Jeg har et Windows-batch script, som overfører de nyeste versioner af en familie af Excel-tilføjelser fra en ekstern server, placerer dem i en mappe (C: \ appname \ AddIns) og kalder Excel-filen Installer.xlsm.


Ved indlæsning udfører Installer.xlsm en VBA-makro, der afinstallerer ældre versioner af tilføjelsesprogrammerne og installerer deres nyere version.


I øjeblikket starter jeg Installer.xlsm ved hjælp af kommandoen:


start "Launching installer file" /wait "<Path to file>Installer.xlsm"


Hvad der er godt med det er, at det bruger Windows 'filforening til at åbne Excel, og jeg behøver ikke at levere EXCEL.EXE installationsvejen (flere brugere med forskellige maskine billeder og MS Office versioner).


Nu vil jeg gerne indlæse Installer.xlsm i safemode for at sikre, at ingen tilføjelser er indlæst, og der køres ingen anden kode, mens Installer.xlsm forsøger at arbejde sammen med tilføjelsesprogrammerne.


Jeg ved, at jeg kan bruge "<PathToExcel>excel" /safemode "<PathToXls>Installer.xlsm" som beskrevet i dette svar, men denne metode bruger ikke Windows-filforening og kræver, at jeg angiver en sti.


Vi har brugere med forskellige maskine billeder ved hjælp af forskellige versioner af MS Office, så jeg ønsker ikke at komme ind i hardcoding alle mulige Excel installationssteder.


Kan jeg gøre noget af følgende formular:


start "Launching installer file" /wait "<Path to file>Installer.xlsm /safemode"


Jeg forsøgte forskellige mulige kombinationer uden succes. Hvordan ville du gøre det?

Bedste reference


Først foreslår jeg at læse Microsoft TechNet-artiklen om ansøgningsregistrering. Det forklarer, hvordan installationsprogrammet til en applikation eller en applikationspakke som Microsoft Office skal registrere det eller de installerede applikationer, så at de/de applikationer, der kan eksporteres, findes i andre applikationer. [37]


Det anbefales at oprette under registernøgle


HKEY\_LOCAL\_MACHINESOFTWAREMicrosoftWindowsCurrentVersionApp Paths


en undernøgle med navnet på den eksekverbare fil som excel.exe med standardstrengens værdi er navnet på den eksekverbare med den fulde sti og valgfrit tilføjer en strengstørrelse med navn Path, der kun indeholder sti til den eksekverbare. Strengen Path kan men de fleste ikke eksisterer, og det kan, men må ikke ende med en tilbageslag.


Kommandoen START bruger også denne nøgle til at finde et program som forklaret i svaret på Hvor er 'START' søger efter eksekverbare filer?


Installatørerne af de forskellige versioner af Microsoft Office registrerer også excel.exe -tasten under denne nøgle.


Så den nemmeste metode på Windows Vista og senere Windows-versioner til at få installationsplaceringen af ​​Microsoft Excel er:


@echo off
for /F "skip=1 tokens=2*" \%\%A in ('\%SystemRoot\%System32
eg.exe QUERY "HKLMSoftwareMicrosoftWindowsCurrentVersionApp Pathsexcel.exe" /ve 2^>nul') do set "ExcelApp=\%\%~B"
echo ExcelApp=\%ExcelApp\%
pause


Men i Windows XP er udgangen af ​​reg.exe anderledes og kræver derfor denne batchkode:


@echo off
for /F "skip=3 tokens=3*" \%\%A in ('\%SystemRoot\%System32
eg.exe QUERY "HKLMSoftwareMicrosoftWindowsCurrentVersionApp Pathsexcel.exe" /ve 2^>nul') do set "ExcelApp=\%\%~B"
echo ExcelApp=\%ExcelApp\%
pause


De forskellige outputs forklares svar på Læs ord adskilt af plads & strengværdi indeholder også plads i et batch script i batchkode skrevet for at få strengværdi for en standardstreng af en registreringsnøgle, der indeholder mellemrum.


Og det er god kodningspraksis at tilføje ekstra kode, som håndterer en fejl sag som registreringsdatabasenøgle slet ikke eksisterer, fordi Microsoft Excel ikke er installeret overhovedet.


Men er det muligt med batchkode at gøre hvad kommando START henholdsvis Windows shell-funktionen ShellExecuteEx gør ved at bruge kommandolinjen? [40] i et kommandopromptvindue


start "Launching installer file" "C:Path to fileInstaller.xlsm"


Ja, det er muligt, da den kommenterede batchkode nedenfor viser.


@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem First query default string value of HKEY\_CLASSES\_ROOT.xlsm from registry.
call :GetDefaultRegValue "HKCR.xlsm"

rem Is there no key HKEY\_CLASSES\_ROOT.xlsm or was the default string empty?
if not defined RegValue goto GetFromAppPaths

SET RegValue
rem Get the shell command line used for opening a *.xlsm file.
call :GetDefaultRegValue "HKCR\%RegValue\%shellopencommand"

rem Could the command line not read successfully from Windows registry?
if not defined RegValue goto GetFromAppPaths

SET RegValue
rem The command line contains as first string usually enclosed in double
rem quotes EXCEL.EXE with full path enclosed in double quotes. And there
rem can be even more arguments on the command line which are not needed
rem here. The command line below is used to get just first string of
rem the command line which should be EXCEL.EXE with full path.
for \%\%I in (\%RegValue\%) do set "RegValue=\%\%~I" & goto CheckExcelExistence

rem It is not good when both registry queries above fail. This means
rem either Microsoft Excel is not installed at all or a version of
rem Excel is installed which does not support *.xlsm files like Excel
rem of MS Office 2003, MS Office 2000 or MS Office 97.

rem However, perhaps just *.xlsm is not correct registered and therefore
rem get full path to excel.exe from application registration key.

:GetFromAppPaths
call :GetDefaultRegValue "HKLMSoftwareMicrosoftWindowsCurrentVersionApp Pathsexcel.exe"
if defined RegValue goto CheckExcelExistence

echo Failed to determine installation location of Microsoft Excel.
echo/
endlocal
pause
goto :EOF

:CheckExcelExistence
SET RegValue
rem Remove surrounding double quotes if the Excel executable file name
rem read from Windows registry is still enclosed in double quotes.
set "RegValue=\%RegValue:"=\%"
if exist "\%RegValue\%" goto :RunInstall

echo Registered "\%RegValue\%" does not exist.
echo/
endlocal
pause
goto :EOF

:RunInstall
SET RegValue
ECHO start "Launching installer file" /wait "\%RegValue\%" "\%~dp0Installer.xlsm" /safemode
endlocal
goto :EOF


rem This subroutine queries from Windows registry the default string value of
rem the key passed to the subroutine as first and only parameter and assigns
rem this value to environment variable RegValue. Environment variable RegValue
rem is deleted and therefore is not defined after subroutine exits on failure
rem to get the registry value or when the default value is an empty string.
rem This subroutine works for Windows XP and all later versions of Windows.

:GetDefaultRegValue
set "TypeToken=2"

:Reg3Run
for /F "skip=1 tokens=\%TypeToken\%*" \%\%A in ('\%SystemRoot\%System32
eg.exe QUERY "\%~1" /ve 2^>nul') do (
    if "\%\%A" == "REG\_SZ" (
        if not "\%\%~B" == "" (
            set "RegValue=\%\%B"
            goto :EOF
        )
    ) else if "\%\%A" == "NAME>" (
        set "TypeToken=3"
        goto Reg3Run
    )
)
set "RegValue="
goto :EOF


Denne batchkode er kun en demonstration. Det starter ikke Excel, når det virkelig er fundet. I stedet udsender det bare kommandolinjen, som ville starte Excel på grund af ECHO til venstre for start ... i blok under etiket RunInstall.


Endvidere indeholder denne batchkode 4 linjer med kun SET RegValue. Disse 4 linjer udsender kun strengværdien, der forespørges succesfuldt fra Windows-registreringsdatabasen og gemmes i miljøvariabel RegValue. Disse 4 kommandoer hjælper med at forstå, hvad der sker ved udførelsen af ​​batchfilen. Disse fire kommandolinjer skal slettes endeligt fra batchfilen og også den enkelte ECHO skrevet i store bogstaver.


Bemærk: Det er ret nemt at teste, hvad der sker, hvis en forventet registreringsnøgle ikke findes, eller hvis standardværdien er en tom streng. Indsæt kun et enkelt tegn som # inden sidste dobbeltkurs på en linje der begynder med call :GetDefaultRegValue, og den ændrede registreringsnøgle findes ikke længere.


For at forstå de anvendte kommandoer og hvordan de virker, skal du åbne et kommandopromptvindue, udføre de følgende kommandoer, og læs helt alle hjælpesider, der vises for hver kommando, meget omhyggeligt.



  • call /?

  • echo /?

  • endlocal /?

  • for /?

  • goto /?

  • if /?

  • pause /?

  • reg /?

  • reg query /?

  • rem /?

  • setlocal /?

  • start /?



Læs også Microsoft-artiklen om Brug af kommandoredirection-operatører til en forklaring af 2>nul. Omdirigeringsoperatøren > skal undslippes med karet karakter ^ FOR kommandolinjen, der skal fortolkes som bogstavkarakter, når Windows-kommandolyderen behandler denne kommandolinje, før kommandoen FOR , som udfører den indlejrede reg.exe kommandolinje i en separat kommandoproces, der startes i baggrunden. [41]