remove dotnet does-not-exist testing key (was successful)

--- SysAdmin/deployment/install-Pro.bat
+++ SysAdmin/deployment/install-Pro.bat
@@ -9,10 +9,10 @@

 :checkPrivileges
   :: courtesy of https://ss64.com/nt/syntax-elevate.html
-  @echo Testing for admin privileges...
+  @echo Testing: for admin privileges...
   fsutil dirty query %SYSTEMDRIVE% >nul
   If %errorLevel% NEQ 0 (
-     Echo Failure, please rerun this script from an elevated command prompt. Exiting...
+     Echo ** Please rerun this script from an elevated command prompt. Exiting...
      Ping 127.0.0.1 3>&1 > nul
      Exit /B 1
   )
@@ -20,18 +20,18 @@

 :checkDotNet
   :: Check for .NET courtesy of @curtvprice
-  @echo Testing for correct Dot Net framework
-  set x64key=HKLM\SOFTWARE\Microsoft\.NETFramework_DOESNOTEXIST
+  @echo Testing: for correct Dot Net framework
+  set key=HKLM\SOFTWARE\Microsoft\.NETFramework
   :: 4.6.1 x64
-  %WINDIR%\system32\reg.exe query %x64key%  /f ".NETFramework,Version=v4.6.1" /k /s
+  %WINDIR%\system32\reg.exe query %key%  /f ".NETFramework,Version=v4.6.1" /k /s >NUL
   if %errorLevel% NEQ 0 (
-     echo ** Microsoft .NET Framework 4.6.1 ^(x64^) not installed!
+     echo ** Microsoft .NET Framework 4.6.1 ^(x64^) must be installed first
      ping 127.0.0.1 3>&1 > nul
      exit /B 1
   )
   @echo Success: Microsoft .NET Framework 4.6.1 ^(x64^) verified

-  call :install_pro
+  REM call :install_pro

 timeout /t 15
 popd


Vijay - 2017/04/23 - spring cloud, boot, microservices examples

--- common/word-restservices/run-all.bat
+++ common/word-restservices/run-all.bat
@@ -21,13 +21,13 @@
 :: verify test.bat file for more info on timeout

 start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=subject"
-timeout /t 15 > NUL
+timeout /t 20 > NUL
 start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=verb"
-timeout /t 15 > NUL
+timeout /t 20 > NUL
 start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=article"
-timeout /t 15 > NUL
+timeout /t 20 > NUL
 start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=adjective"
-timeout /t 15 > NUL
+timeout /t 20 > NUL
 start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=noun"
 :: sentence is now part of different webservice in commons project so commenting it
 ::start call mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=sentence"


add push.bat

add push.bat

error: pathspec 'ZKWeb/nuget/push.bat' did not match any file(s) known to git

--- ZKWeb/nuget/push.bat
+++ ZKWeb/nuget/push.bat
@@ -0,0 +1,3 @@
+@echo off
+for %%f in (*.nupkg) do nuget push -Source nuget.org "%%f"
+timeout 5


Update bat

Update bat

--- Yak-Hax-Mimerme/release/release.bat
+++ Yak-Hax-Mimerme/release/release.bat
@@ -1,3 +1,3 @@
 @ECHO off
-if not exists %UTILS_PATH%\yhack\values.txt echo "File not exists"
+if not exist %UTILS_PATH%\yhack\values.txt echo. 2>values.txt
 java -jar %UTILS_PATH%\yhack\yhack.jar %1 %2 %3 %4 %5 %6 %7 %8


remove nunit option that don't really matter

--- CreateTestresults.cmd
+++ CreateTestresults.cmd
@@ -5,7 +5,7 @@
 REM pause

 Cd "%~dp0\TestHarness\packages\NUnit.Runners.*\tools"
-"nunit-console.exe" "%~dp0\TestHarness\nunit\bin\Debug\nunitHarness.dll" /result="%~dp0\results-example-nunit.xml" /nologo /nodots
+"nunit-console.exe" "%~dp0\TestHarness\nunit\bin\Debug\nunitHarness.dll" /result="%~dp0\results-example-nunit.xml"

 Cd "%~dp0\TestHarness\packages\SpecRun.Runner.*\tools"


Support installation path with spaces on Windows  #2400

--- src/main/bin/dita.bat
+++ src/main/bin/dita.bat
@@ -27,7 +27,7 @@

 :setDefaultDitaHome
 rem %~dp0 is expanded pathname of the current script under NT
-set DITA_HOME="%~dp0.."
+set DITA_HOME=%~dp0..

 rem Slurp the command line arguments. This loop allows for an unlimited number
 rem of arguments (up to the command line limit, anyway).


Quit vim after installing plugins.

Quit vim after installing plugins.

--- windows/install.bat
+++ windows/install.bat
@@ -64,4 +64,4 @@
 emacs.exe -Q --script %USERPROFILE%\.third_party\cask\cask-cli.el -- install
 popd

-call vim -c ":PlugInstall"
+call vim -c ":PlugInstall" -c ":q"


VE - removing old file

VE - removing old file

--- Vault/Explorer/LaunchPowerShell.cmd
+++ Vault/Explorer/LaunchPowerShell.cmd
@@ -1,4 +0,0 @@
-rem Copyright (c) Microsoft Corporation. All rights reserved.
-rem Licensed under the MIT License. See License.txt in the project root for license information.
-
-@powershell -NoExit -ExecutionPolicy Unrestricted -Command "Import-Module .\Vault.psm1"


Update purge-edgecast.bat

Update purge-edgecast.bat

--- Vendors/Edgecast/purge-edgecast.bat
+++ Vendors/Edgecast/purge-edgecast.bat
@@ -2,7 +2,7 @@
 @setlocal

 :: Sample usage:
-:: purge-edgecast.bat http://wpc.121E0.edgecastcdn.net/00121E0/winafar/testapi.txt
+:: purge-edgecast.bat http://wpc.121X0.edgecastcdn.net/00121X0/ecfolder/testapi.txt
 :: This file is set up for a specific platform, the Platform variable can also be set to be passed as an input

 set ConfigFile=Edgecast-config.txt


MONDRIAN: added commons io and commons lang to workbench.bat

[git-p4: depot-paths = "//open/mondrian/": change = 11896]

--- workbench/workbench.bat
+++ workbench/workbench.bat
@@ -5,6 +5,8 @@
 rem base Mondrian JARs need to be included

 set CP=lib/commons-dbcp.jar
+set CP=%CP%;lib/commons-io.jar
+set CP=%CP%;lib/commons-lang.jar
 set CP=%CP%;lib/commons-collections.jar
 set CP=%CP%;lib/commons-pool.jar
 set CP=%CP%;lib/eigenbase-properties.jar


Update RingLibCurl - buildvc.bat - use locatevc.bat

--- extensions/ringcurl/buildvc.bat
+++ extensions/ringcurl/buildvc.bat
@@ -1,5 +1,5 @@
 cls
-call "C:\Program Files\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
+call ../../src/locatevc.bat
 cl /c /DEBUG ring_libcurl.c -I"..\..\libdepwin\libcurl\include" -I"..\..\include"
 link /DEBUG ring_libcurl.obj  ..\..\lib\ring.lib ..\..\libdepwin\libcurl\lib\libcurl.lib /DLL /OUT:..\..\bin\ring_libcurl.dll /SUBSYSTEM:CONSOLE,"5.01"
 del ring_libcurl.obj


Update RingLibSDL - Add document.bat

Update RingLibSDL - Add document.bat

error: pathspec 'extensions/ringsdl/document.bat' did not match any file(s) known to git

--- extensions/ringsdl/document.bat
+++ extensions/ringsdl/document.bat
@@ -0,0 +1,2 @@
+ring gendoc.ring
+copy ringlibsdlfuncsdoc.txt ..\docs\source\


HOTFIX: Fixing build script for Linux.

HOTFIX: Fixing build script for Linux.


New Installation Scripts

New Installation Scripts

--- Windows/install_oasys.bat
+++ Windows/install_oasys.bat
@@ -53,6 +53,13 @@
 start /wait /b cmd /c %cd%\aux_bin\install_libraries.bat
 start /wait /b cmd /c %cd%\aux_bin\create_oasys_icon.bat

+set /p "user_decision=Do you want to [d]elete or [l]eave Miniconda installer?>"
+if /I "!user_decision!"=="d" (
+    del /s Miniconda3-4.7.12.1-Windows-x86_64.exe
+) else (
+    echo Installer left in folder %cd%
+)
+
 echo --------------------------------------------------------------
 echo Oasys installation completed!
 echo Double click the icon in the Desktop to run the program"


fix "file not found" errors

fix "file not found" errors

Also remove accidental inclusion of Windows Classic Shell v4.2.4

--- resources/stage_2_de-bloat/programs_to_target_by_GUID.bat
+++ resources/stage_2_de-bloat/programs_to_target_by_GUID.bat
@@ -946,13 +946,9 @@
 start /wait msiexec /qn /norestart /x {FF10AC4D-3349-99DA-3E58-5197CEA1D833}
 start /wait msiexec /qn /norestart /x {FFCF34B9-A0B1-2E2B-7D7E-8FAB4A781CC9}

-
 :: CITIZEN bloatware (printer)
 start /wait msiexec /qn /norestart /x {546D97C7-9DF6-4A2D-BE02-2C0B25FFE1E3}
 start /wait msiexec /qn /norestart /x {39688AE1-0398-4133-942C-EECA9BBD64CC}
-
-:: CLEART WiMAX Tutorial 1.5.0.10
-start /wait msiexec /qn /norestart /x {E289B7DD-6732-4333-A47A-75A145D23EE3}

 :: Clickfree
 start /wait msiexec /qn /norestart /x {1EB9B986-CECA-4E05-B454-C9343EE9DDE7}
@@ -1050,7 +1046,7 @@
 start /wait msiexec /qn /norestart /x {97308CC9-FAED-4A1C-9593-64B2F1FD852D}
 start /wait msiexec /qn /norestart /x {4DEF2722-7EB8-4C5F-8F0A-0295A310002A}
 start /wait msiexec /qn /norestart /x {AE9EB677-66F4-40C0-9269-35067D8C555B}
-rd /s /q %SystemDrive%\dell\dbrm
+if exist %SystemDrive%\dell\dbrm rd /s /q %SystemDrive%\dell\dbrm

 :: Dell Best of Web 1.00.0000
 start /wait msiexec /qn /norestart /x {BC8233D8-59BA-4D40-92B9-4FDE7452AA8B}
@@ -2224,8 +2220,8 @@
 start /wait msiexec /qn /norestart /x {D9428275-602F-4D4B-A921-9CC642B76995}

 :: McAfee LiveSafe - Internet Security
-if exist %ProgramFiles(x86)%\McAfee\MSC\mcuihost.exe %ProgramFiles(x86)%\McAfee\MSC\mcuihost.exe /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall
-if exist %ProgramFiles%\McAfee\MSC\mcuihost.exe %ProgramFiles%\McAfee\MSC\mcuihost.exe /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall
+if exist "%ProgramFiles(x86)%\McAfee\MSC\mcuihost.exe" "%ProgramFiles(x86)%\McAfee\MSC\mcuihost.exe" /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall
+if exist "%ProgramFiles%\McAfee\MSC\mcuihost.exe" "%ProgramFiles%\McAfee\MSC\mcuihost.exe" /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall

 :: Media Gallery
 start /wait msiexec /qn /norestart /x {115B60D5-BBDB-490E-AF2E-064D37A3CE01}
@@ -2328,7 +2324,7 @@

 :: Office 2013 C2R Suite
 start /wait msiexec /qn /norestart /x {90150000-0138-0409-0000-0000000FF1CE}
-start /wait msiexec /x "C:\ProgramData\Microsoft\OEMOffice15\OOBE\x86\oemoobe.msi" /qn /norestart
+if exist "%ProgramData%\Microsoft\OEMOffice15\OOBE\x86\oemoobe.msi" start /wait msiexec /qn /norestart /x "%ProgramData%\Microsoft\OEMOffice15\OOBE\x86\oemoobe.msi"

 :: opensource
 start /wait msiexec /qn /norestart /x {3677D4D8-E5E0-49FC-B86E-06541CF00BBE}


Create create_cifar10.bat

Create create_cifar10.bat

error: pathspec 'examples/cifar10/create_cifar10.bat' did not match any file(s) known to git

--- examples/cifar10/create_cifar10.bat
+++ examples/cifar10/create_cifar10.bat
@@ -0,0 +1,15 @@
+@echo off
+echo Creating leveldb...
+if exist cifar10-leveldb (
+    rmdir cifar10-leveldb /s /q
+ ) else (
+ 	mkdir cifar10-leveldb
+ )
+SET DATA="./cifar-10-batches-bin"
+SET GLOG_logtostderr=1
+"../../bin/convert_cifar_data.exe" %DATA% ./cifar10-leveldb
+SET GLOG_logtostderr=1
+echo Computing image mean...
+"../../bin/compute_image_mean.exe" ./cifar10-leveldb/cifar-train-leveldb mean.binaryproto
+echo Done.
+pause


Filter out warnings coming from the stylesheets, so that actual warnings show up properly. Show some minor progress messages.

--- src/tools/msvc/builddoc.bat
+++ src/tools/msvc/builddoc.bat
@@ -26,9 +26,12 @@
 perl mk_feature_tables.pl YES ..\..\..\src\backend\catalog\sql_feature_packages.txt ..\..\..\src\backend\catalog\sql_features.txt > features-supported.sgml
 perl mk_feature_tables.pl NO ..\..\..\src\backend\catalog\sql_feature_packages.txt ..\..\..\src\backend\catalog\sql_features.txt > features-unsupported.sgml

-%DOCROOT%\%OPENJADE%\bin\openjade -V draft-mode -wall -wno-unused-param -wno-empty -D . -c %DOCROOT%\%DSSSL%\catalog -d stylesheet.dsl -i output-html -t sgml postgres.sgml
+echo Running first build...
+%DOCROOT%\%OPENJADE%\bin\openjade -V draft-mode -wall -wno-unused-param -wno-empty -D . -c %DOCROOT%\%DSSSL%\catalog -d stylesheet.dsl -i output-html -t sgml postgres.sgml 2>&1 | findstr /V "DTDDECL catalog entries are not supported"
+echo Running collateindex...
 perl %DOCROOT%\%DSSSL%\bin\collateindex.pl -f -g -i 'bookindex' -o bookindex.sgml HTML.index
-%DOCROOT%\%OPENJADE%\bin\openjade -V draft-mode -wall -wno-unused-param -wno-empty -D . -c %DOCROOT%\%DSSSL%\catalog -d stylesheet.dsl -i output-html -t sgml postgres.sgml
+echo Running second build...
+%DOCROOT%\%OPENJADE%\bin\openjade -V draft-mode -wall -wno-unused-param -wno-empty -D . -c %DOCROOT%\%DSSSL%\catalog -d stylesheet.dsl -i output-html -t sgml postgres.sgml 2>&1 | findstr /V "DTDDECL catalog entries are not supported"

 cd %STARTDIR%
 echo Docs build complete.


Had somewhat wrong path for uninstalling old jau.

--- src/main/assembly/jdk/uninstallAndRemoveAnyOldVersion.bat
+++ src/main/assembly/jdk/uninstallAndRemoveAnyOldVersion.bat
@@ -10,7 +10,7 @@
 )

 :: If previous version of java-auto-update and agent is running remove them and remove directory
-if exist c:\opt\java-auto-update\bin\java-auto-update (
+if exist c:\opt\java-auto-update (
 	echo Removing old Java-Auto-Update
 	c:\opt\java-auto-update\bin\java-auto-update remove
 	taskkill /im java.exe /F


doc migration

doc migration

error: pathspec 'doc/make.bat' did not match any file(s) known to git

--- doc/make.bat
+++ doc/make.bat
@@ -0,0 +1,113 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+set SPHINXBUILD=sphinx-build
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html      to make standalone HTML files
+	echo.  dirhtml   to make HTML files named index.html in directories
+	echo.  pickle    to make pickle files
+	echo.  json      to make JSON files
+	echo.  htmlhelp  to make HTML files and a HTML help project
+	echo.  qthelp    to make HTML files and a qthelp project
+	echo.  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  changes   to make an overview over all changed/added/deprecated items
+	echo.  linkcheck to check all external links for integrity
+	echo.  doctest   to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\sphinx_try.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\sphinx_try.ghc
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+:end


Add support for VS2013 in build.cmd

Add support for VS2013 in build.cmd

--- Src/build.cmd
+++ Src/build.cmd
@@ -1,4 +1,9 @@
 @echo off
+
+if exist "%VS120COMNTOOLS%vsvars32.bat" (
+  @call "%VS120COMNTOOLS%vsvars32.bat"
+  goto build
+)

 if exist "%VS110COMNTOOLS%vsvars32.bat" (
   @call "%VS110COMNTOOLS%vsvars32.bat"
@@ -10,7 +15,7 @@
   goto build
 )

-echo Requires VS2012 or VS2010 to be installed
+echo Requires VS2013 or VS2012 or VS2010 to be installed
 goto exit

 :build


add entries based on user feedback

add entries based on user feedback

--- resources/stage_2_de-bloat/programs_to_target_by_GUID.bat
+++ resources/stage_2_de-bloat/programs_to_target_by_GUID.bat
@@ -12,6 +12,9 @@
 :: Absolute Notifier // Absolute Reminder
 start /wait msiexec /qn /norestart /x {40F4FF7A-B214-4453-B973-080B09CED019}
 start /wait msiexec /qn /norestart /x {FB500000-0010-0000-0000-074957833700}
+
+:: Acer Bluetooth Win7 Suite -64 7.2.0.56
+start /wait msiexec /qn /norestart /x {FCD6D60F-AF2B-49E3-ABC4-A4C96B56225D}

 :: Accidental Damage Services Agreement
 start /wait msiexec /qn /norestart /x {EBE939ED-4612-45FD-A39E-77AC199C4273}
@@ -147,6 +150,9 @@

 :: ASUS Ai Charger
 start /wait msiexec /qn /norestart /x {7FB64E72-9B0E-4460-A821-040C341E414A}
+
+:: ASUS WinFlash
+start /wait msiexec /qn /norestart /x {FFCF82EC-895F-4AC8-925E-3412FE25EF62}

 :: Avery Toolbar
 start /wait msiexec /qn /norestart /x {8D20B4D7-3422-4099-9332-39F27E617A6F}
@@ -293,7 +299,6 @@
 start /wait msiexec /qn /norestart /x {C7FDA25B-9A0F-487B-9502-35ABBF701599}
 start /wait msiexec /qn /norestart /x {BCBE985F-DE7D-41EA-A8AB-A575AEEDBDBD}
 start /wait msiexec /qn /norestart /x {823FCD0D-756D-44BE-A546-1D4D9FBBEA8C}
-

 :: Catalyst Control Center - Branding 1.00.0000
 start /wait msiexec /qn /norestart /x {FB90923E-F94F-4343-A084-F0AB39305C8B}
@@ -879,6 +884,10 @@
 start /wait msiexec /qn /norestart /x {FF10AC4D-3349-99DA-3E58-5197CEA1D833}
 start /wait msiexec /qn /norestart /x {FFCF34B9-A0B1-2E2B-7D7E-8FAB4A781CC9}

+:: CITIZEN bloatware (printer)
+start /wait msiexec /qn /norestart /x {546D97C7-9DF6-4A2D-BE02-2C0B25FFE1E3}
+start /wait msiexec /qn /norestart /x {39688AE1-0398-4133-942C-EECA9BBD64CC}
+
 :: CLEART WiMAX Tutorial 1.5.0.10
 start /wait msiexec /qn /norestart /x {E289B7DD-6732-4333-A47A-75A145D23EE3}

@@ -891,10 +900,11 @@
 :: Consumer In-Home Service Agreement
 start /wait msiexec /qn /norestart /x {F7DA7A20-8EC4-4960-95E5-5531D518B97E}

-:: Corel DVD MovieFactory // Photo Album // WinDVD
+:: Corel DVD MovieFactory // Photo Album // WinDVD // Direct DiscRecorder
 start /wait msiexec /qn /norestart /x {1DF03ECE-6AF4-414E-B118-C316F151A9A2}
 start /wait msiexec /qn /norestart /x {5C1F18D2-F6B7-4242-B803-B5A78648185D}
 start /wait msiexec /qn /norestart /x {50F68032-B5B7-4513-9116-C978DBD8F27A}
+start /wait msiexec /qn /norestart /x {FC09380E-74BE-41F5-8353-E97113969040}

 :: Coupon Network 12.10.2.4058
 start /wait msiexec /qn /norestart /x {6B66E18F-BC5C-47AC-A66C-9F0814A8A0EB}
@@ -1011,6 +1021,9 @@
 start /wait msiexec /qn /norestart /x {11F1920A-56A2-4642-B6E0-3B31A12C9288}
 start /wait msiexec /qn /norestart /x {7DB9F1E5-9ACB-410D-A7DC-7A3D023CE045}

+:: Dell Digital Content Portal
+start /wait msiexec /qn /norestart /x {C7FB1A71-D808-4CD2-997D-837B39EA7EB0}
+
 :: Dell Digital Delivery (various versions)
 start /wait msiexec /qn /norestart /x {2A0F2CC5-3065-492C-8380-B03AA7106B1A}
 start /wait msiexec /qn /norestart /x {4688EB75-28E2-4731-9BCB-55E624F7CD45}
@@ -1107,6 +1120,13 @@
 :: Dell System Restore 2.00.0000
 start /wait msiexec /qn /norestart /x {7358D71A-DEFE-47DB-910A-B1CAC9C9D7C1}

+:: Dell Trusted Drive Manager
+start /wait msiexec /qn /norestart /x {6AC87FB3-ACFC-4416-890C-8976D5A9B371}
+start /wait msiexec /qn /norestart /x {A093D83F-429A-4AB2-A0CD-1F7E9C7B764A}
+start /wait msiexec /qn /norestart /x {236EBEF4-8DE5-4E0E-8FD0-27D94F772FF0}
+start /wait msiexec /qn /norestart /x {98E68EAC-A3B3-4ECA-8110-84CBCFFF2878}
+start /wait msiexec /qn /norestart /x {DDD6BE8C-9AFA-48F1-A6AE-3BD596E2EB0B}
+
 :: Dell Unified Wireless Suite 1.0.158
 start /wait msiexec /qn /norestart /x {D850CB7E-72BC-4510-BA4F-48932BFAB295}

@@ -1170,11 +1190,35 @@
 :: Dell Support Center
 start /wait msiexec /qn /norestart /x {0090A87C-3E0E-43D4-AA71-A71B06563A4A}

+:: Dell Wave Crypto Runtime, Infrastructure Installer, Support Software Installer
+start /wait msiexec /qn /norestart /x {8A2EF9A3-F1A8-4160-8C7D-4CADA7883BD1}
+start /wait msiexec /qn /norestart /x {30C2392C-C7D6-4FE2-9617-05D2C6E9D3EE}
+start /wait msiexec /qn /norestart /x {14CFC674-CD4F-4BE5-8B68-07BA3FE941FF}
+start /wait msiexec /qn /norestart /x {777FF553-493D-4068-BAC7-EE2D73DB7434}
+start /wait msiexec /qn /norestart /x {07D618CD-B016-438A-ADC9-A75BD23F85CE}
+start /wait msiexec /qn /norestart /x {5F160A36-29D0-4AE0-986C-671A564BC0D4}
+start /wait msiexec /qn /norestart /x {90DB5C39-360F-4187-9D56-E3B013CEEF73}
+start /wait msiexec /qn /norestart /x {86A9BBDF-9B6D-4E3D-810E-23C9079C6217}
+start /wait msiexec /qn /norestart /x {5FDA8F6A-E87C-484B-BDE2-12C1BE199149}
+start /wait msiexec /qn /norestart /x {67154CF5-2C33-41C2-A9F2-A4FBC29482AD}
+start /wait msiexec /qn /norestart /x {29D07FB4-A026-4E1F-B9A2-8C9EC0E2FEBB}
+start /wait msiexec /qn /norestart /x {083CE5FA-E750-4594-B8D1-13994B297A02}
+start /wait msiexec /qn /norestart /x {8C0600A3-E772-4FC8-A67D-ED110E69665C}
+start /wait msiexec /qn /norestart /x {A8991BF1-A3DC-4110-836A-C467AF9B71E8}
+start /wait msiexec /qn /norestart /x {79B520D5-CE72-4661-A054-804BC3412516}
+
 :: Desktop Doctor 2.5.5
 start /wait msiexec /qn /norestart /x {D87149B3-7A1D-4548-9CBF-032B791E5908}

+:: DIBS 1.7.0
+start /wait msiexec /qn /norestart /x {2EA870FA-585F-4187-903D-CB9FFD21E2E0}
+
 :: DisableMSDefender
 start /wait msiexec /qn /norestart /x {74FE39A0-FB76-47CD-84BA-91E2BBB17EF2}
+
+:: Dolby Advanced Audio // Home Theater
+start /wait msiexec /qn /norestart /x {B26438B4-BF51-49C3-9567-7F14A5E40CB9}
+start /wait msiexec /qn /norestart /x {936CFA73-585F-4F5E-AB62-1350FE16E5FC}

 :: Download Windows Universal Tools 14.0.22823
 start /wait msiexec /qn /norestart /x {7C361160-7ADC-46CE-AFDC-D10C6EADD032}
@@ -1255,6 +1299,10 @@

 :: Fujitsu System Extension Utility 2.1.1.0
 start /wait msiexec /qn /norestart /x {DED08875-D1AE-4E66-BE84-BB746019B9F9}
+
+:: Garmin Elevated Installer; known to cause popups and crash frequently
+start /wait msiexec /qn /norestart /x {D4D065E1-3ABF-41D0-B385-FC6F027F4D00}
+start /wait msiexec /qn /norestart /x {4694981D-8031-4526-90BE-E5F7FB80CBB8}

 :: Get Dropbox (also called "Dropbox 25 GB" or "Dropbox 15 GB")
 start /wait msiexec /qn /norestart /x {597A58EC-42D6-4940-8739-FB94491B013C}
@@ -1327,6 +1375,9 @@
 :: HP C4400_Help
 start /wait msiexec /qn /norestart /x {4F923F90-46D1-4492-9CC6-13FBBA00E7EC}

+:: HP Cards_Calendar_OrderGift_DoMorePlugout 1.00.0000
+start /wait msiexec /qn /norestart /x {C918E3D8-208F-43DB-B346-6299D59336D7}
+
 :: HP CinemaNow Media Manager
 start /wait msiexec /qn /norestart /x {A5E65B95-F016-474D-BC0D-6AF64412BBDF}

@@ -1394,10 +1445,16 @@
 :: HP Deskjet 3050 J610 series Product Improvement Study 22.0.334.0
 start /wait msiexec /qn /norestart /x {FEB2C4AA-661E-483F-9626-21A8ACFD10F2}

+:: HP Destinations
+start /wait msiexec /qn /norestart /x {5E487136-B52E-4856-8F5F-FCDF5E5FC5EE}
+start /wait msiexec /qn /norestart /x {D99A8E3A-AE5A-4692-8B19-6F16D454E240}
+start /wait msiexec /qn /norestart /x {EF9E56EE-0243-4BAD-88F4-5E7508AA7D96}
+
 :: HP Device Access Manager
 start /wait msiexec /qn /norestart /x {2642BE09-1F9F-4E18-AAD4-0258B9BCE611}
 start /wait msiexec /qn /norestart /x {9EC0BE64-2C6C-428A-A4C2-E7EDF831B29A}
 start /wait msiexec /qn /norestart /x {DBCD5E64-7379-4648-9444-8A6558DCB614}
+start /wait msiexec /qn /norestart /x {BD7204BA-DD64-499E-9B55-6A282CDF4FA4}

 :: HP DeviceManagementQFolder
 start /wait msiexec /qn /norestart /x {AB5D51AE-EBC3-438D-872C-705C7C2084B0}
@@ -1437,6 +1494,7 @@

 :: HP DisableMSDefender (disables Microsoft Defender...wtf?)
 start /wait msiexec /qn /norestart /x {74FE39A0-FB76-47CD-84BA-91E2BBB17EF2}
+start /wait msiexec /qn /norestart /x {AF9E97C1-7431-426D-A8D5-ABE40995C0B1}

 :: HP Drive Encryption
 start /wait msiexec /qn /norestart /x {1868D30B-72C7-41E8-9657-69C5DFE1C768}
@@ -1757,6 +1815,10 @@
 :: HP USB Docking Video (wtf?)
 start /wait msiexec /qn /norestart /x {B0069CFA-5BB9-4C03-B1C6-89CE290E5AFE}

+:: HP UserGuide, UserProfileManager SDK Snap-in
+start /wait msiexec /qn /norestart /x {C23415D8-FE94-4F52-B5C4-0FFA2202C6D9}
+start /wait msiexec /qn /norestart /x {F07C2CF8-4C53-4EC3-8162-A6221E36EB88}
+
 :: HP Utility Center
 start /wait msiexec /qn /norestart /x {B7B82520-8ECE-4743-BFD7-93B16C64B277}
 start /wait msiexec /qn /norestart /x {07FA4960-B038-49EB-891B-9F95930AA544}
@@ -1850,8 +1912,9 @@
 start /wait msiexec /qn /norestart /x {83F793B5-8BBF-42FD-A8A6-868CB3E2AAEA}
 start /wait msiexec /qn /norestart /x {43A76F9B-48F1-4E0D-A9B4-8E4F6C42E28C}

-:: Intel Viiv(TM) Software 1.7.512.0
+:: Intel Viiv(TM) various software GUIDs
 start /wait msiexec /qn /norestart /x {A6C48A9F-694A-4234-B3AA-62590B668927}
+start /wait msiexec /qn /norestart /x {F007CBCE-D714-4C0B-8CE9-9B0D78116468}

 :: Intel WiMAX Tutorial
 start /wait msiexec /qn /norestart /x {4F26C164-9373-4974-8F43-E0F2176AF937}
@@ -2061,6 +2124,11 @@

 :: opensource
 start /wait msiexec /qn /norestart /x {3677D4D8-E5E0-49FC-B86E-06541CF00BBE}
+start /wait msiexec /qn /norestart /x {E6B87DC4-2B3D-4483-ADFF-E483BF718991}
+
+:: P@H-Protocol (coupon nagware/bloatware)
+start /wait msiexec /qn /norestart /x {14F936AB-5D31-410E-A4E2-70AE504712F2}
+start /wait msiexec /qn /norestart /x {2D91C34E-12CC-4B1B-90D5-31DAD47B6F48}

 :: Panasonic Common Components for Panasonic PC 3.0.1400.100
 start /wait msiexec /qn /norestart /x {7804E86D-6DA1-1014-8C88-F05533644796}
@@ -2223,34 +2291,57 @@
 :: Toshiba Application Installer
 start /wait msiexec /qn /norestart /x {21A63CA3-75C0-4E56-B602-B7CD2EF6B621}
 start /wait msiexec /qn /norestart /x {970472D0-F5F9-4158-A6E3-1AE49EFEF2D3}
+start /wait msiexec /qn /norestart /x {1E6A96A1-2BAB-43EF-8087-30437593C66C}
+
+:: TOSHIBA Audio Enhancement
+start /wait msiexec /qn /norestart /x {11955FE2-CAC6-4C3B-AA68-F787D7405400}

 :: Toshiba App Place
 start /wait msiexec /qn /norestart /x {ED3CBA78-488F-4E8C-B33F-8E3BF4DDB4D2}
+start /wait msiexec /qn /norestart /x {84FA4D2D-4273-4C66-BD3D-ADD3FE48DFA2}

 :: TOSHIBA Assist
 start /wait msiexec /qn /norestart /x {1B87C40B-A60B-4EF3-9A68-706CF4B69978}
+
+:: Toshiba Bluetooth Statck for Windows by Toshiba
+start /wait msiexec /qn /norestart /x {230D1595-57DA-4933-8C4E-375797EBB7E1}

 :: Toshiba Book Place
 start /wait msiexec /qn /norestart /x {11244D6B-9842-440F-8579-6A4D771A0D9B}
 start /wait msiexec /qn /norestart /x {92C7DC44-DAD3-49FE-B89B-F92C6BA9A331}
 start /wait msiexec /qn /norestart /x {39187A4B-7538-4BE7-8BAD-9E83303793AA}
+start /wait msiexec /qn /norestart /x {05A55927-DB9B-4E26-BA44-828EBFF829F0}

 :: Toshiba Bulletin Board
 start /wait msiexec /qn /norestart /x {C14518AF-1A0F-4D39-8011-69BAA01CD380}
 start /wait msiexec /qn /norestart /x {229C190B-7690-40B7-8680-42530179F3E9}

+:: TOSHIBA ConfigFree
+start /wait msiexec /qn /norestart /x {716C8275-A4A9-48CB-88C0-9829334CA3C5}
+
 :: Toshiba Desktop Assist
 start /wait msiexec /qn /norestart /x {95CCACF0-010D-45F0-82BF-858643D8BC02}

-:: TOSHIBA Disc Creator 2.1.0.4 for x64
+:: TOSHIBA Disc Creator
 start /wait msiexec /qn /norestart /x {5DA0E02F-970B-424B-BF41-513A5018E4C0}
+start /wait msiexec /qn /norestart /x {5944B9D4-3C2A-48DE-931E-26B31714A2F7}

 :: Toshiba Display Utility
 start /wait msiexec /qn /norestart /x {0B39C39A-3ECE-4582-9C91-842D22819A24}
+start /wait msiexec /qn /norestart /x {ED3CBA78-488F-4E8C-B33F-8E3BF4DDB4D2}
+start /wait msiexec /qn /norestart /x {78C6A78A-8B03-48C8-A47C-78BA1FCA2307}
+start /wait msiexec /qn /norestart /x {11244D6B-9842-440F-8579-6A4D771A0D9B}

 :: TOSHIBA Eco Utility
 start /wait msiexec /qn /norestart /x {72EFCFA8-3923-451D-AF52-7CE9D87BC2A1}
 start /wait msiexec /qn /norestart /x {5944B9D4-3C2A-48DE-931E-26B31714A2F7}
+start /wait msiexec /qn /norestart /x {59358FD4-252B-4B38-AB81-955C491A494F}
+
+:: TOSHIBA Extended Tiles for Windows Mobility Center
+start /wait msiexec /qn /norestart /x {5DA0E02F-970B-424B-BF41-513A5018E4C0}
+
+:: TOSHIBA Flash Cards Support Utility
+start /wait msiexec /qn /norestart /x {617C36FD-0CBE-4600-84B2-441CEB12FADF}

 :: TOSHIBA HDD/SDD Alert 3.1.64.6
 start /wait msiexec /qn /norestart /x {D4322448-B6AF-4316-B859-D8A0E84DCB38}
@@ -2261,9 +2352,11 @@

 :: Toshiba Password Utility
 start /wait msiexec /qn /norestart /x {26BB68BB-CF93-4A12-BC6D-A3B6F53AC8D9}
+start /wait msiexec /qn /norestart /x {21A63CA3-75C0-4E56-B602-B7CD2EF6B621}

 :: TOSHIBA Quality Application
 start /wait msiexec /qn /norestart /x {E69992ED-A7F6-406C-9280-1C156417BC49}
+start /wait msiexec /qn /norestart /x {620BBA5E-F848-4D56-8BDA-584E44584C5E}

 :: TOSHIBARegistration
 start /wait msiexec /qn /norestart /x {5AF550B4-BB67-4E7E-82F1-2C4300279050}
@@ -2277,6 +2370,7 @@
 :: Toshiba Service Station
 start /wait msiexec /qn /norestart /x {0DFA8761-7735-4DE8-A0EB-2286578DCFC6}
 start /wait msiexec /qn /norestart /x {6499E894-43F8-458B-AE35-724F4732BCDE}
+start /wait msiexec /qn /norestart /x {F64E9295-E1B3-4EEA-86D3-AF44A0087B06}

 :: TOSHIBA Speech System Appplications, SR Engine(U.S.), TTS Engine(U.S.)
 start /wait msiexec /qn /norestart /x {EE033C1F-443E-41EC-A0E2-559B539A4E4D}
@@ -2285,10 +2379,12 @@

 :: Toshiba System Driver
 start /wait msiexec /qn /norestart /x {1E6A96A1-2BAB-43EF-8087-30437593C66C}
+start /wait msiexec /qn /norestart /x {16562A90-71BC-41A0-B890-D91B0C267120}

 :: Toshiba System Settings
 start /wait msiexec /qn /norestart /x {B040D5C9-C9AA-430A-A44E-696656012E61}
 start /wait msiexec /qn /norestart /x {05A55927-DB9B-4E26-BA44-828EBFF829F0}
+start /wait msiexec /qn /norestart /x {EFCCEE68-1317-40A5-B785-C07AD2769338}

 :: Toshiba Utility Common Driver (hidden)
 start /wait msiexec /qn /norestart /x {12688FD7-CB92-4A5B-BEE4-5C8E0574434F}
@@ -2298,6 +2394,7 @@

 :: Toshiba Value Added Package
 start /wait msiexec /qn /norestart /x {066CFFF8-12BF-4390-A673-75F95EFF188E}
+start /wait msiexec /qn /norestart /x {FBFCEEA5-96EA-4C8E-9262-43CBBEBAE413}

 :: TOSHIBA Web Camera Application
 start /wait msiexec /qn /norestart /x {5E6F6CF3-BACC-4144-868C-E14622C658F3}
@@ -2375,6 +2472,18 @@

 :: WOT for Internet Explorer plugin
 start /wait msiexec /qn /norestart /x {373B90E1-A28C-434C-92B6-7281AFA6115A}
+
+:: Video Downloader, VideoManager, VideoStage, VideoToolkit
+start /wait msiexec /qn /norestart /x {62796191-6F12-4ABE-BA8B-B4D4A266C997}
+start /wait msiexec /qn /norestart /x {6F0FA48E-DAEE-4CCE-BA6A-68C25E27BC85}
+start /wait msiexec /qn /norestart /x {E60AFF01-6087-47BD-8272-61FA3CFC309D}
+start /wait msiexec /qn /norestart /x {9C618A4D-5428-41B7-8A25-36B311FF8C77}
+start /wait msiexec /qn /norestart /x {DCE0E79A-B9AC-41AC-98C1-7EF0538BCA7F}
+
+:: WD Quick View, SmartWare
+start /wait msiexec /qn /norestart /x {F9843E68-4E61-41B0-946E-66989DB35902}
+start /wait msiexec /qn /norestart /x {7AE43D6C-B3F1-448D-AD84-1CDC7AC6EBC7}
+start /wait msiexec /qn /norestart /x {79966948-BECF-4CB1-A79F-E76C830A17D2}

 :: WildTangent GUIDs. Thanks to /u/mnbitcoin
 start /wait msiexec /qn /norestart /x {23170F69-40C1-2702-0938-000001000000}
@@ -2428,6 +2537,9 @@

 :: Xmarks for IE
 start /wait msiexec /qn /norestart /x {ABFA6EAE-C9C0-4B39-B722-02094EF6B889}
+
+:: Xnet Local Print Extension
+start /wait msiexec /qn /norestart /x {FD8D8382-4058-4F74-8EF1-FE61091F854A}

 :: YouTube Downloader 2.7.2
 start /wait msiexec /qn /norestart /x {1a413f37-ed88-4fec-9666-5c48dc4b7bb7}


fix: recursive copying needs "/E" option

--- src/universal/bin/sbt.bat
+++ src/universal/bin/sbt.bat
@@ -151,7 +151,7 @@
     if not exist %PRELOAD_SBT_JAR% (
       if exist "%SBT_HOME%\..\lib\local-preloaded\" (
         echo 'about to robocopy'
-        robocopy "%SBT_HOME%\..\lib\local-preloaded\" "%UserProfile%\.sbt\preloaded"
+        robocopy "%SBT_HOME%\..\lib\local-preloaded" "%UserProfile%\.sbt\preloaded" /E
       )
     )
   )


Create run.bat

Create run.bat

error: pathspec 'algorithms/permutations-of-a-set/run.bat' did not match any file(s) known to git

--- algorithms/permutations-of-a-set/run.bat
+++ algorithms/permutations-of-a-set/run.bat
@@ -0,0 +1,5 @@
+mkdir bin
+javac -d bin Program.java
+cd bin
+java -ea Program
+pause


Add docker wrapper for windows

Add docker wrapper for windows

error: pathspec 'doritool.cmd' did not match any file(s) known to git

--- doritool.cmd
+++ doritool.cmd
@@ -0,0 +1,2 @@
+
+docker run --rm -u 1000 -v %cd%:/home/vep/doritool --name doritool doritool/doritool %*


Forgot to copy a file...

Forgot to copy a file...

--- external/mswin/for_binaries/prepare_for_binaries.bat
+++ external/mswin/for_binaries/prepare_for_binaries.bat
@@ -7,6 +7,8 @@
 mkdir ..\..\..\setup
 copy setup.bat ..\..\..\setup\
 copy ..\setup.py ..\..\..\setup\
+copy ..\create_shortcut.vbs ..\..\..\setup\
+

 REM Clean this copy of Topographica...


Update purge_windows_10_telemetry.bat

Update purge_windows_10_telemetry.bat

--- resources/stage_4_repair/disable_windows_telemetry/purge_windows_10_telemetry.bat
+++ resources/stage_4_repair/disable_windows_telemetry/purge_windows_10_telemetry.bat
@@ -6,7 +6,8 @@
 ::                  - win10-unfu**k: https://github.com/dfkt/win10-unfuck
 ::                  - WindowsLies:   https://github.com/WindowsLies/BlockWindows
 ::                  - ... and many other places around the web
-:: Version:       1.2.7-TRON ! Fix standalone and Tron-called execution due to typo in STANDALONE variable comparison command. Thanks to u/bubonis
+:: Version:       1.2.8-TRON ! bugfix: Move OneDrive and SkyDrive (old OneDrive name) disabling code via registry from this script into appropriate location in the Stage 2 debloat script. Thanks to u/Tenelia
+::                1.2.7-TRON ! Fix standalone and Tron-called execution due to typo in STANDALONE variable comparison command. Thanks to u/bubonis
 ::                1.2.6-TRON ! Fix standalone execution not working in some sections due to relative paths being different. Thanks to u/AncientAv
 ::                1.2.5-TRON + Add disabling of "Occasionally show suggestions in Start"
 ::                1.2.4-TRON ! Fix standalone execution broken due to use of uninitialized %REG% variable
@@ -43,8 +44,8 @@
 :: PREP AND CHECKS ::
 :::::::::::::::::::::
 @echo off
-set SCRIPT_VERSION=1.2.7-TRON
-set SCRIPT_UPDATED=2018-11-19
+set SCRIPT_VERSION=1.2.8-TRON
+set SCRIPT_UPDATED=2019-06-05

 :: Populate dependent variables if we didn't inherit them from Tron (standalone execution)
 set STANDALONE=no
@@ -413,13 +414,6 @@
 	%REG% add "HKLM\software\microsoft\windows defender\spynet" /v "spynetreporting" /t REG_DWORD /d "0" /f
 	%REG% add "HKLM\software\microsoft\windows defender\spynet" /v "submitsamplesconsent" /t REG_DWORD /d "0" /f

-	REM SkyDrive
-	%REG% add "HKLM\software\policies\microsoft\windows\skydrive" /v "disablefilesync" /t REG_DWORD /d "1" /f
-
-	REM Kill OneDrive from hooking into Explorer even when disabled
-	%REG% add "HKCR\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /v "System.IsPinnedToNameSpaceTree" /t REG_DWORD /d "0" /f
-	%REG% add "HKCR\Wow6432Node\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /v "System.IsPinnedToNameSpaceTree" /t REG_DWORD /d "0" /f
-
 	REM DiagTrack service
 	%REG% add "HKLM\SYSTEM\CurrentControlSet\Services\DiagTrack" /v "Start" /t REG_DWORD /d "4" /f

@@ -449,13 +443,6 @@
 	REM Windows Defender sample reporting
 	%REG% add "HKLM\software\microsoft\windows defender\spynet" /v "spynetreporting" /t REG_DWORD /d "0" /f >> "%LOGPATH%\%LOGFILE%" 2>&1
 	%REG% add "HKLM\software\microsoft\windows defender\spynet" /v "submitsamplesconsent" /t REG_DWORD /d "0" /f >> "%LOGPATH%\%LOGFILE%" 2>&1
-
-	REM SkyDrive
-	%REG% add "HKLM\software\policies\microsoft\windows\skydrive" /v "disablefilesync" /t REG_DWORD /d "1" /f >> "%LOGPATH%\%LOGFILE%" 2>&1
-
-	REM Kill OneDrive from hooking into Explorer even when disabled
-	%REG% add "HKCR\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /v "System.IsPinnedToNameSpaceTree" /t REG_DWORD /d "0" /f >> "%LOGPATH%\%LOGFILE%" 2>&1
-	%REG% add "HKCR\Wow6432Node\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /v "System.IsPinnedToNameSpaceTree" /t REG_DWORD /d "0" /f >> "%LOGPATH%\%LOGFILE%" 2>&1

 	REM DiagTrack service
 	%REG% add "HKLM\SYSTEM\CurrentControlSet\Services\DiagTrack" /v "Start" /t REG_DWORD /d "4" /f >> "%LOGPATH%\%LOGFILE%" 2>&1
@@ -819,4 +806,4 @@
 %REG% ADD HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CloudContent /v DisableWindowsConsumerFeatures /t REG_DWORD /d 1 /f

-if %STANDALONE%==no (call functions\log.bat "     Done.") else (echo "Done.")+if %STANDALONE%==no (call functions\log.bat "     Done.") else (echo "Done.")


Little test

Little test

--- Scripts/GoRepack.cmd
+++ Scripts/GoRepack.cmd
@@ -3,6 +3,9 @@
 del "%~dp0DeveMultiCompressor.zip"

 "%~dp0..\packages\ILRepack.2.0.11\tools\ILRepack.exe" /out:"%~dp0Output\DeveMultiCompressor.exe" "%~dp0..\DeveMultiCompressor\bin\Release\DeveMultiCompressor.exe" "%~dp0..\DeveMultiCompressor\bin\Release\CommandLine.dll" "%~dp0..\DeveMultiCompressor\bin\Release\FSharp.Core.dll" "%~dp0..\DeveMultiCompressor\bin\Release\Newtonsoft.Json.dll"
+
+cd "%~dp0Output"
+dir

 xcopy "%~dp0..\DeveMultiCompressor\bin\Release\Compressors" "Output\Compressors\" /e /y
 xcopy "%~dp0..\DeveMultiCompressor\bin\Release\Precompressors" "Output\Precompressors\" /e /y


Fixed at last the errorlevel for good keys with nothing inside. Factored out routine :Prep2ExpandVars, and use it before displaying any name or value. Fixes issues with ! and ^.

--- Batch/regx.bat
+++ Batch/regx.bat
@@ -3,14 +3,18 @@
 :#                                                                            #
 :#  Filename:	    regx.bat						      #
 :#                                                                            #
-:#  Description:    Browse the registry "directories"=keys and "files"=values #
-:#                                                                            #
-:#  Notes:	    Pure batch file, using just Windows' reg.exe.	      #
-:#		    Outputs in my SML structured format.		      #
+:#  Description:    Manage the registry "directories"=keys and "files"=values #
+:#                                                                            #
+:#  Notes:	    Front end to Windows' reg.exe.			      #
+:#		    Uses the familiar dir, type, tree, set, del, rd commands  #
+:#		    for managing registry keys and values as if they were     #
+:#		    directories and files.				      #
+:#		    The show command output is in my SML structured format.   #
 :#		    							      #
-:#                  Registry pathnames may contain & characters, which break  #
-:#                  the set command if not quoted. Be careful to use quoting  #
-:#		    consistently everywhere.				      #
+:#                  Registry pathnames and values may contain tricky          #
+:#                  characters like '%' '!' '^', which break the set, call,   #
+:#		    echo, etc., commands if not quoted correctly. This script #
+:#		    demonstates techniques for doing this consistently.	      #
 :#		    							      #
 :#		    Uses external calls to other instances of this script.    #
 :#		    This proved necessary for several reasons:		      #
@@ -30,6 +34,10 @@
 :#		        HKCU\Control Panel\Desktop\PerMonitorSettings	      #
 :#		    A key with data containing the ^ character:		      #
 :#		    HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Extensions #
+:#		    A key with subkeys containing the ! character:	      #
+:#		        HKLM\SOFTWARE\Microsoft\DirectDraw\Compatibility      #
+:#		    A key with subkeys containing the ! character:	      #
+:#			HKCR\Acrobat.aaui\shell\Open\command		      #
 :#		    							      #
 :#		    To do: Manage complex multi-line values.		      #
 :#		           Ex: HKLM\Cluster\Exchange\DagNetwork		      #
@@ -52,13 +60,17 @@
 :#                  characters to for /f ('commands'). Necessary because some #
 :#                  keys do have a % in their name.                           #
 :#                  Walk down the registry tree using callbacks.              #
+:#   2016-11-22 JFL Fixed at last the errorlevel for good keys with nothing   #
+:#                  inside.                                                   #
+:#   2016-11-23 JFL Factored out routine :Prep2ExpandVars, and use it before  #
+:#                  displaying any name or value. Fixes issues with ! and ^.  #
 :#                                                                            #
 :#          Copyright 2016 Hewlett Packard Enterprise Development LP         #
 :# Licensed under the Apache 2.0 license  www.apache.org/licenses/LICENSE-2.0 #
 :##############################################################################

 setlocal EnableExtensions EnableDelayedExpansion
-set "VERSION=2016-11-18"
+set "VERSION=2016-11-23"
 set "SCRIPT=%~nx0"
 set "SPATH=%~dp0" & set "SPATH=!SPATH:~0,-1!"
 set "ARG0=%~f0"
@@ -73,7 +85,7 @@
 set FOREACHLINE=for /f "delims="

 :# Default definitions
-set "POPARG=call :PopArg"
+call :PopArg.Init
 call :Macro.Init
 call :Debug.Init
 call :Exec.Init
@@ -83,16 +95,29 @@
 :#                                                                            #
 :#  Function        PopArg                                                    #
 :#                                                                            #
-:#  Description     Pop the first arguments from %ARGS% into %ARG%            #
-:#                                                                            #
-:#  Arguments       %ARGS%	    Command line arguments                    #
-:#                                                                            #
-:#  Returns         %ARG%           The unquoted argument                     #
+:#  Description     Pop the first argument from %ARGS% into %ARG% and %"ARG"% #
+:#                                                                            #
+:#  Macros          %POPARG%        Pop one argument                          #
+:#                  %POPSARG%       Faster version, not supporting ! or ^ val.#
+:#                                                                            #
+:#  Input           %ARGS%	    Command line arguments                    #
+:#                                                                            #
+:#  Output          %ARG%           The unquoted argument                     #
 :#                  %"ARG"%         The actual argument, possibly quoted      #
+:#                  %ARGS%	    Remaining command line arguments          #
 :#                                                                            #
 :#  Notes 	    Works around the defect of the shift command, which       #
 :#                  pops the first argument from the %* list, but does not    #
 :#                  remove it from %*.                                        #
+:#                  Also works around another defect with tricky characters   #
+:#                  like ! or ^ being lost when variable expansion is on.     #
+:#                                                                            #
+:#                  Important: The performance of this routine is much better #
+:#                  when invoked with variable expansion disabled. This is    #
+:#                  due to the complex processing done to avoid issues with   #
+:#                  tricky characters like ! or ^ when expansion is enabled.  #
+:#                  If you're sure that NONE of the arguments contain such    #
+:#                  tricky characters, then call :PopSimpleArg.               #
 :#                                                                            #
 :#                  Use an inner call to make sure the argument parsing is    #
 :#                  done by the actual cmd.exe parser. This guaranties that   #
@@ -100,6 +125,13 @@
 :#                                                                            #
 :#                  But call itself has a quirk, which requires a convoluted  #
 :#                  workaround to process the /? argument.                    #
+:#                                                                            #
+:#                  Known limitation: After using :PopArg, all consecutive    #
+:#                  argument separators in %ARGS% are replaced by one space.  #
+:#                  For example: "A==B" becomes "A B"                         #
+:#                  This does not change the result of subsequent calls to    #
+:#                  :PopArg, but this prevents from using the tail itself as  #
+:#                  an argument. => Do not use :PopArg to get :Exec args!     #
 :#                                                                            #
 :#                  To do: Detect if the last arg has mismatched quotes, and  #
 :#                  if it does, append one.                                   #
@@ -112,17 +144,76 @@
 :#   2015-04-03 JFL Bug fix: Quoted args with an & inside failed to be poped. #
 :#   2015-07-06 JFL Bug fix: Call quirk prevented inner call from popping /?. #
 :#   2016-11-18 JFL Fixed popping arguments containing % characters.          #
-:#                                                                            #
-:#----------------------------------------------------------------------------#
+:#   2016-11-21 JFL Fixed popping quoted arguments containing &|<> characters.#
+:#   2016-11-22 JFL Fixed popping arguments containing ^ characters.          #
+:#   2016-11-24 JFL Updated %POPARG% to work with trick characters ! and ^ in #
+:#                  delayed expansion mode. The old and faster version is now #
+:#		    called %POPSARG%.                                         #
+:#		    Added routine :Prep2ExpandVars allowing to pass any       #
+:#		    tricky string across call or endlocal barriers.           #
+:#                                                                            #
+:#----------------------------------------------------------------------------#
+
+call :PopArg.Init
+goto PopArg.end
+
+:PopArg.Init
+set "POPARG=call :PopArg"
+set "POPSARG=call :PopSimpleArg"
+
+:# Define a LF variable containing a Line Feed ('\x0A')
+set LF=^
+%# The two blank lines here are necessary. #%
+%# The two blank lines here are necessary. #%
+
+:# Define a CR variable containing a Carriage Return ('\x0D')
+for /f %%a in ('copy /Z %COMSPEC% nul') do set "CR=%%a"
+
+:# Define a BS variable containing a BackSpace ('\x08')
+:# Use prompt to store a  backspace+space+backspace into a DEL variable.
+for /F "tokens=1 delims=#" %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "DEL=%%a"
+:# Then extract the first backspace
+set "BS=%DEL:~0,1%"
+
+:# Define variables for problematic characters, that cause parsing issues
+:# Use the ASCII control character name, or the html entity name.
+:# Warning: The excl and hat characters need different quoting depending on context.
+set  "DEBUG.percnt=%%"	&:# One percent sign
+set  "DEBUG.excl=^!"	&:# One exclamation mark
+set  "DEBUG.hat=^"	&:# One caret, aka. circumflex accent, or hat sign
+set ^"DEBUG.quot=""	&:# One double quote
+set  "DEBUG.apos='"	&:# One apostrophe
+set  "DEBUG.amp=&"	&:# One ampersand
+set  "DEBUG.vert=|"	&:# One vertical bar
+set  "DEBUG.gt=>"	&:# One greater than sign
+set  "DEBUG.lt=<"	&:# One less than sign
+set  "DEBUG.lpar=("	&:# One left parenthesis
+set  "DEBUG.rpar=)"	&:# One right parenthesis
+set  "DEBUG.lbrack=["	&:# One left bracket
+set  "DEBUG.rbrack=]"	&:# One right bracket
+set  "DEBUG.sp= "	&:# One space
+set  "DEBUG.tab=	"	&:# One tabulation
+set  "DEBUG.quest=?"	&:# One question mark
+set  "DEBUG.ast=*"	&:# One asterisk
+set  "DEBUG.cr=!CR!"	&:# One carrier return
+set  "DEBUG.lf=!LF!"	&:# One line feed
+set  "DEBUG.bs=!BS!"	&:# One backspace
+goto :eof

 :PopArg
+if "!!"=="" goto :PopArg.Eon
+:PopArg.Eoff
+:PopSimpleArg
 :# Gotcha: The call parser first scans its command line for an unquoted /?.
 :# If it finds one anywhere on the command line, then it ignores the target label and displays call help.
 :# To work around that, we initialize %ARG% and %"ARG"% with an impossible combination of values.
 set "ARG=Yes"
 set ""ARG"=No"
-setlocal EnableDelayedExpansion
-if defined ARGS for /f "delims=" %%a in ("!ARGS:%%=%%%%!") do endlocal & set PopArg.ARGS=%%a
+set "PopArg.ARGS="
+if defined ARGS (
+  setlocal EnableDelayedExpansion
+  for /f "delims=" %%a in ("!ARGS:%%=%%%%!") do endlocal & set ^"PopArg.ARGS=%%a^"
+)
 call :PopArg.Helper %PopArg.ARGS% >NUL 2>NUL &:# Output redirections ensure the call help is not actually output.
 :# Finding that impossible combination now is proof that the call was not executed.
 :# In this case, try again with the /? quoted, to prevent the call parser from processing it.
@@ -132,16 +223,69 @@
 goto :eof
 :PopArg.Helper
 set "ARG=%~1"	&:# Remove quotes from the argument
-set ""ARG"=%1"	&:# The same with quotes, if any, should we need them
+set ^""ARG"=%1^"	&:# The same with quotes, if any, should we need them
+if defined ARG set "ARG=%ARG:^^=^%"
+if defined "ARG" set ^""ARG"=%"ARG":^^=^%^"
 :# Rebuild the tail of the argument line, as shift does not do it
 :# Never quote the set ARGS command, else some complex quoted strings break
 set ARGS=%2
 :PopArg.GetNext
 shift
+if defined ARGS set ^"ARGS=%ARGS:^^=^%^"
 if [%2]==[] goto :eof
 :# Leave quotes in the tail of the argument line
 set ARGS=%ARGS% %2
 goto :PopArg.GetNext
+
+:PopArg.Eon
+setlocal DisableDelayedExpansion
+call :PopArg
+call :Prep2ExpandVars ARG ^""ARG"^" ARGS
+setlocal EnableDelayedExpansion
+for /f %%a in ("-!ARG!") do for /f %%b in ("-!"ARG"!") do for /f %%c in ("-!ARGS!") do (
+  endlocal
+  endlocal
+  set "ARG=%%a"
+  set "ARG=!ARG:~1!"
+  set ^""ARG"=%%b^"
+  set ^""ARG"=!"ARG":~1!^"
+  set ^"ARGS=%%c^"
+  set "ARGS=!ARGS:~1!"
+)
+goto :eof
+
+:# Prepare variables to return from the local scope (with expansion on or off) to a parent scope with expansion on
+:Prep2ExpandVars VAR [VAR ...]
+if "!!"=="" goto :Prep2ExpandVars.Eon
+:Prep2ExpandVars.Eoff	:# The local scope has expansion off
+setlocal EnableDelayedExpansion
+set "VALUE=!%~1!"
+call :Prep2ExpandVars.Eon VALUE
+endlocal & set "%~1=%VALUE%"
+if not [%2]==[] shift & goto :Prep2ExpandVars.Eoff
+goto :eof
+
+:# Prepare variables, assuming the local scope itself has expansion on
+:Prep2ExpandVars.Eon VAR [VAR ...]
+if defined %1 (
+  for %%e in (sp tab cr lf quot amp vert lt gt hat percnt) do ( :# Encode named character entities
+    for %%c in ("!DEBUG.%%e!") do (
+      set "%~1=!%~1:%%~c= DEBUG.%%e !"
+    )
+  )
+  call set "%~1=%%%~1:^!= DEBUG.excl %%" 	& rem :# Encode exclamation points
+  call set "%~1=%%%~1: =^!%%"			& rem :# Encode final expandable entities
+)
+if not [%2]==[] shift & goto :Prep2ExpandVars.Eon
+goto :eof
+
+:# Prepare variables containing pathnames that will be passed as "arguments"
+:PrepArgVars
+set "%~1=!%~1:%%=%%%%!"				&:# Escape percent signs
+if not [%2]==[] shift & goto :PrepArgVars
+goto :eof
+
+:PopArg.end

 :#----------------------------------------------------------------------------#
 :#                                                                            #
@@ -216,13 +360,6 @@
 goto :Macro.End

 :Macro.Init
-:# Define a LF variable containing a Line Feed ('\x0A')
-:# The two blank lines below are necessary.
-set LF=^
-
-
-:# End of define Line Feed. The two blank lines above are necessary.
-
 :# LF generator variables, that become an LF after N expansions
 :# %LF1% == %LF% ; %LF2% == To expand twice ; %LF3% == To expand 3 times ; Etc
 :# Starting with LF2, the right # of ^ doubles on every line,
@@ -264,16 +401,6 @@
 :#       They should be removed from the released code.
 set "XDLEVEL=0" &:# 0=No macro debug; 1=medium debug; 2=full debug; 3=Even more debug
 set "IF_XDLEVEL=for /f %%' in ('call echo.%%XDLEVEL%%') do if %%' GEQ"
-
-:# While at it, and although this is unrelated to macros, define other useful ASCII control codes
-:# Define a CR variable containing a Carriage Return ('\x0D')
-for /f %%a in ('copy /Z %COMSPEC% nul') do set "CR=%%a"
-
-:# Define a BS variable containing a BackSpace ('\x08')
-:# Use prompt to store a  backspace+space+backspace into a DEL variable.
-for /F "tokens=1 delims=#" %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "DEL=%%a"
-:# Then extract the first backspace
-set "BS=%DEL:~0,1%"

 goto :eof
 :Macro.end
@@ -396,6 +523,7 @@
 :#   2016-11-02 JFL Bug fix: Avoid log file redirection failures in recursive #
 :#                  scripts.                                                  #
 :#   2016-11-13 JFL Bug fix: Correctly return special characters & | < > ? *  #
+:#   2016-11-24 JFL Fixed tracing %FUNCTION% arguments with ^ and % chars.    #
 :#                                                                            #
 :#----------------------------------------------------------------------------#

@@ -409,29 +537,6 @@
 :# Initialize other debug variables
 set "ECHO=call :Echo"
 set "ECHOVARS=call :EchoVars"
-:# Define variables for problematic characters, that cause parsing issues
-:# Use the ASCII control character name, or the html entity name.
-:# Warning: The excl and hat characters need different quoting depending on context.
-set "DEBUG.percnt=%%"	&:# One percent sign
-set "DEBUG.excl=^!"	&:# One exclamation mark
-set "DEBUG.hat=^"	&:# One caret, aka. circumflex accent, or hat sign
-set ^"DEBUG.quot=""	&:# One double quote
-set "DEBUG.apos='"	&:# One apostrophe
-set "DEBUG.amp=&"	&:# One ampersand
-set "DEBUG.vert=|"	&:# One vertical bar
-set "DEBUG.gt=>"	&:# One greater than sign
-set "DEBUG.lt=<"	&:# One less than sign
-set "DEBUG.lpar=("	&:# One left parenthesis
-set "DEBUG.rpar=)"	&:# One right parenthesis
-set "DEBUG.lbrack=["	&:# One left bracket
-set "DEBUG.rbrack=]"	&:# One right bracket
-set "DEBUG.sp= "	&:# One space
-set "DEBUG.tab=	"	&:# One tabulation
-set "DEBUG.quest=?"	&:# One question mark
-set "DEBUG.ast=*"	&:# One asterisk
-set "DEBUG.cr=!CR!"	&:# One carrier return
-set "DEBUG.lf=!LF!"	&:# One line feed
-set "DEBUG.bs=!BS!"	&:# One backspace
 :# The FUNCTION, UPVAR, and RETURN macros should work with delayed expansion on or off
 set MACRO.GETEXP=(if "%'!2%%'!2%"=="" (set MACRO.EXP=EnableDelayedExpansion) else set MACRO.EXP=DisableDelayedExpansion)
 set UPVAR=call set DEBUG.RETVARS=%%DEBUG.RETVARS%%
@@ -526,7 +631,8 @@
 set "FUNCTION0=rem"
 set FUNCTION=%MACRO.GETEXP% %&% %MACRO% ( %\n%
   call set "FUNCTION.NAME=%%0" %\n%
-  call set "ARGS=%%*"%\n%
+  call set ARGS=%%*%# Do not quote this, to keep string/non string aternance #%%\n%
+  set ARGS=%!%ARGS:^^^^^^^^^^^^^^^^=^^^^^^^^%!%%# ^carets are doubled in quoted strings, halved outside. => Quadruple them if using unquoted ones #%%\n%
   set "DEBUG.RETVARS=" %\n%
   if not defined MACRO.ARGS set "MACRO.ARGS=%'!%MACRO.EXP%'!%" %\n%
   setlocal %!%MACRO.ARGS%!% %\n%
@@ -551,7 +657,8 @@
 set "FUNCTION0=call call :Debug.Entry0 %%0 %%*"
 set FUNCTION=%MACRO.GETEXP% %&% %MACRO% ( %\n%
   call set "FUNCTION.NAME=%%0" %\n%
-  call set "ARGS=%%*"%\n%
+  call set ARGS=%%*%# Do not quote this, to keep string/non string aternance #%%\n%
+  set ARGS=%!%ARGS:^^^^^^^^^^^^^^^^=^^^^^^^^%!%%# ^carets are doubled in quoted strings, halved outside. => Quadruple them if using unquoted ones #%%\n%
   if %!%DEBUG%!%==1 ( %# Build the debug message and display it #% %\n%
     if defined ^^%>%DEBUGOUT ( %# If we use a debugging stream distinct from stdout #% %\n%
       call :Echo.2DebugOut call %!%FUNCTION.NAME%!% %!%ARGS:%%=%%%%%!%%# Use a helper routine, as delayed redirection does not work #%%\n%
@@ -648,14 +755,26 @@

 :Echo.Eval2DebugOut %*=String with variables that need to be evaluated first
 :# Must be called with delayed expansion on, so that !variables! within %* get expanded
+%>DEBUGOUT% echo.%INDENT%%*
+goto :eof
+
 :Echo.2DebugOut	%*=String to output to the DEBUGOUT stream
-%>DEBUGOUT% echo.%INDENT%%*
+setlocal DisableDelayedExpansion &:# Make sure !variables! do _not_ get expanded
+set ^"ARGS=%*^" &:# ^carets within "quoted" strings get doubled.
+if defined ARGS set ^"ARGS=%ARGS:^^=^%^"
+%>DEBUGOUT% echo.%INDENT%%ARGS%
 goto :eof

 :Echo.Eval2LogFile %*=String with variables that need to be evaluated first
 :# Must be called with delayed expansion on, so that !variables! within %* get expanded
+%>>LOGFILE% echo.%INDENT%%*
+goto :eof
+
 :Echo.2LogFile %*=String to output to the LOGFILE
-%>>LOGFILE% echo.%INDENT%%*
+setlocal DisableDelayedExpansion &:# Make sure !variables! do _not_ get expanded
+set ^"ARGS=%*^" &:# ^carets within "quoted" strings get doubled.
+if defined ARGS set ^"ARGS=%ARGS:^^=^%^"
+%>>LOGFILE% echo.%INDENT%%ARGS%
 goto :eof

 :# Echo and log variable values, indented at the same level as the debug output.
@@ -734,6 +853,8 @@
 :#                              %EXEC% can't be used, like in for ('cmd') ... #
 :#                  %IF_EXEC%   Execute a command if _not_ in NOEXEC mode     #
 :#                  %IF_NOEXEC% Execute a command in NOEXEC mode only         #
+:#                  %DOECHO%    Echo and run a command. No logging.           #
+:#                  %DOECHO.D%  Idem, echoing it in debug mode only.          #
 :#                                                                            #
 :#  Variables       %NOEXEC%	Exec mode. 0=Execute commands; 1=Don't. Use   #
 :#                              functions Exec.Off and Exec.On to change it.  #
@@ -777,6 +898,8 @@
 :#		    optional arguments from the command line to run. (The old #
 :#		    method lost non-white batch argument separators = , ; in  #
 :#		    some cases.)                                              #
+:#   2016-11-24 JFL Fixed executing commands containing a ^ character.        #
+:#		    Added routine :DoEcho.                                    #
 :#		                                                              #
 :#----------------------------------------------------------------------------#

@@ -787,6 +910,8 @@
 :Exec.Init
 set "DO=call :Do"
 set "EXEC=call :Exec"
+set "DOECHO=call :DoEcho"
+set "DOECHO.D=call :DoEcho.D"
 set "ECHO.X=call :Echo.X"
 set "ECHO.XD=call :Echo.XD"
 set "ECHO.XVD=call :Echo.XVD"
@@ -858,7 +983,8 @@
 :# Record the command-line to execute.
 :# Never comment (set Exec.cmd) lines themselves, to avoid appending extra spaces.
 :# Use %*, but not %1 ... %9, because %N miss non-white argument separators like = , ;
-set Exec.Cmd=%*
+set ^"Exec.Cmd=%*^" &:# Doubles ^carets within "quoted" strings, and halves those outside
+set ^"Exec.Cmd=%Exec.Cmd:^^=^%^" &:# Fix the # of ^carets within "quoted" strings
 :# Process optional arguments
 goto :Exec.GetArgs
 :Exec.NextArg
@@ -933,6 +1059,18 @@
 call :Exec !%1:%%=%%%%!
 exit /b

+:# Echo a command, then run it as it is.
+:DoEcho
+%ECHO% %*
+%*
+goto :eof
+
+:# Echo a command in debug mode, then run it as it is.
+:DoEcho.D
+%>DEBUGOUT% %ECHO.D% %*
+%*
+goto :eof
+
 :Exec.End

 :#----------------------------------------------------------------------------#
@@ -954,13 +1092,18 @@
 :#                  See "cmd /?" for information about characters needing to  #
 :#                  be quoted.                                                #
 :#                  I've added "@" that needs quoting if first char in cmd.   #
-:#                  I've removed "!" as quoting does NOT prevent expansions.  #
+:#                                                                            #
+:#                  Although this is not the objective of this function,      #
+:#                  some effort is made to also produce a usable string if    #
+:#                  the input contains characters that are invalid in file    #
+:#                  names. Inner '"' are removed. "|&<>" are quoted.	      #
 :#                                                                            #
 :#  History                                                                   #
 :#   2010-12-19 JFL Created this routine                                      #
 :#   2011-12-12 JFL Rewrote using findstr. (Executes much faster.)	      #
 :#		    Added support for empty pathnames.                        #
 :#   2016-11-09 JFL Fixed this routine, which was severely broken :-(	      #
+:#   2016-11-21 JFL Fixed the "!" quoting, and added "|&<>" quoting.	      #
 :#                                                                            #
 :#----------------------------------------------------------------------------#

@@ -972,71 +1115,28 @@
 %UPVAR% %RETVAR%
 set "P=!%~1!"
 :# Remove double quotes inside P. (Fails if P is empty, so skip this in this case)
-if defined P set "P=!P:"=!"
+if defined P set ^"P=!P:"=!"
 :# If the value is empty, don't go any further.
 if not defined P set "P=""" & goto :condquote_ret
-:# Look for any special character that needs quoting
-echo."!P!"|findstr /C:" " /C:"&" /C:"|" /C:"(" /C:")" /C:"@" /C:"," /C:";" /C:"[" /C:"]" /C:"{" /C:"}" /C:"=" /C:"'" /C:"+" /C:"`" /C:"~" >NUL
+:# Look for any special character that needs "quoting". See list from (cmd /?).
+:# Added "@" that needs quoting ahead of commands.
+:# Added "|&<>" that are not valid in file names, but that do need quoting if used in an argument string.
+echo."!P!"|findstr /C:" " /C:"&" /C:"(" /C:")" /C:"[" /C:"]" /C:"{" /C:"}" /C:"^^" /C:"=" /C:";" /C:"!" /C:"'" /C:"+" /C:"," /C:"`" /C:"~" /C:"@" /C:"|" /C:"&" /C:"<" /C:">" >NUL
 if not errorlevel 1 set P="!P!"
 :condquote_ret
 set "%RETVAR%=!P!"
-%RETURN%
-
-:#----------------------------------------------------------------------------#
-:#                                                                            #
-:#  Function        list						      #
-:#                                                                            #
-:#  Description     List management routines                                  #
-:#                                                                            #
-:#  Arguments                                                                 #
-:#                                                                            #
-:#  Notes 	    Inspired from Tcl list management routines                #
+%RETURN%
+
+:#----------------------------------------------------------------------------#
+:#                                                                            #
+:#  Function        dir type tree del rd set start ...			      #
+:#                                                                            #
+:#  Description     Registry file system management routines                  #
+:#                                                                            #
+:#  Notes 	    Several homonyms are provided for each function.          #
 :#                                                                            #
 :#  History                                                                   #
-:#   2016-11-09 JFL Added routine lsort.                                      #
-:#                                                                            #
-:#----------------------------------------------------------------------------#
-
-:lsort LIST_NAME [RETVAR]
-%FUNCTION% EnableExtensions EnableDelayedExpansion
-set "RETVAR=%~2"
-if not defined RETVAR set "RETVAR=%~1"
-%UPVAR% %RETVAR%
-set "SORTED_LIST="
-%ECHOVARS.D% %~1
-set "LIST=!%~1!"
-:# No idea why %FOREACHLINE% appends a space to every line
-if defined LIST %FOREACHLINE% %%l in ('^(for %%e in ^(!%~1!^) do @echo %%e^) ^| sort') do set "SORTED_LIST=!SORTED_LIST!%%l"
-if defined SORTED_LIST set "SORTED_LIST=!SORTED_LIST:~0,-1!"
-set "%RETVAR%=!SORTED_LIST!"
-%RETURN%
-
-:list2lines LIST_NAME
-if defined %~1 for %%e in (!%~1!) do (echo.%%e)
-exit /b
-
-:#----------------------------------------------------------------------------#
-
-:# Check that cmd extensions work
-:check_exts
-verify other 2>nul
-setlocal EnableExtensions EnableDelayedExpansion
-if errorlevel 1 (
-  >&2 echo Error: Unable to enable command extensions.
-  endlocal & exit /b 1
-)
-set VAR=before
-if "%VAR%" == "before" (
-  set VAR=after
-  if not "!VAR!" == "after" (
-    >&2 echo Error: Delayed environment variable expansion must be enabled.
-    >&2 echo Please restart your cmd.exe shell with the /V option,
-    >&2 echo or set HKLM\Software\Microsoft\Command Processor\DelayedExpansion=1
-    endlocal & exit /b 1
-  )
-)
-endlocal & exit /b 0
-
+:#                                                                            #
 :#----------------------------------------------------------------------------#

 :# List subkeys. Args: [-c] [-p PATTERN] [-cb CALLBACK] KEY [RETVAR]
@@ -1049,7 +1149,6 @@
 set "KEY="
 set "RETVAR="
 set "BEFORE="
-set "_ECHO=echo"
 set "CALLBACK="
 :dirs.get_args
 if not defined ARGS goto :dirs.got_args
@@ -1070,22 +1169,36 @@
 set "ERROR="
 set "^ERRORLEVEL=" &:# Make sure the first parsing phase does not expand this in the for 'command' below
 %FOREACHLINE% %%l in ('%XEXEC@% CMD ^& call echo. ERRORLEVEL %%^^ERRORLEVEL%%') do (
-  set "LINE=%%l"
+  setlocal DisableDelayedExpansion
+  set "LINE=%%l" &:# Must be executed with expansion disabled, else ! are lost
+  call :Prep2ExpandVars LINE
+  setlocal EnableDelayedExpansion
+  for /f "delims=" %%m in ("!LINE!") do endlocal & endlocal & set "LINE=%%m" & set "NAME=%%~nxm"
+  %ECHOVARS.D% LINE
+  set "HEAD=!LINE:~0,2!"
   :# Special case of the exit code, appended to the data as a uniquely formatted text line " ERRORLEVEL N"
-  if "!LINE:~0,12!"==" ERRORLEVEL " set "ERROR=!LINE:~12!"
-  set "HEAD=!LINE:~0,2!"
-  if "!HEAD!"=="HK" (
-    set "NAME=%%~nxl"
+  if "!LINE:~0,12!"==" ERRORLEVEL " (
+    :# Gotcha: reg.exe returns errorlevel 1 if the key is valid, but contains no subkey.
+    :#         We override this by looking further down for the summary line with the number of keys found.
+    :#         When the key is invalid, that summary line is not displayed.
+    :#         If it is displayed, and if its value is 0, then ignore the errorlevel 1 here.
+    if not defined ERROR %DOECHO.D% set "ERROR=!LINE:~12!"
+  ) else if "!HEAD!"=="HK" (
     if "!NAME!"=="(Default)" set "NAME="
     set "NAME=!BEFORE!!NAME!"
+    %ECHOVARS.D% NAME
     if defined CALLBACK (
-      call %CALLBACK% "!NAME:%%=%%%%!"
+      if defined NAME set "NAME=!NAME:%%=%%%%!"
+      call %CALLBACK% "!NAME!"
     ) else if defined RETVAR (
       call :CondQuote NAME
       set "RETVAL=!RETVAL! !NAME!"
     ) else (
-      %_ECHO% !NAME!
+      call :Prep2ExpandVars NAME &:# Make sure %ECHO% displays tricky characters correctly
+      %ECHO% !NAME!
     )
+  ) else if not "!HEAD!"=="  " (
+    call :dirs.ParseSummaryCount & rem :# If success, sets "ERROR=0" are returns 0
   )
 )
 if defined RETVAR if "%ERROR%"=="0" (
@@ -1093,7 +1206,23 @@
   if defined RETVAL set "RETVAL=!RETVAL:~1!"
   set "%RETVAR%=!RETVAL!"
 )
-%RETURN% 0 &:# Don't return %ERROR% as it's 1 when there is no sub-key, which is not really an error.
+%RETURN% %ERROR%
+
+:# Parse the summary line, making sure it has the right format, and contains a 0 count.
+:# It's a localized string, looking like: "End of search: 2 match(es) found"
+:# In some languages, the count is not the first word, like in: "Found 2 matches"
+:# This routine is also used when enumerating files.
+:dirs.ParseSummaryCount
+for /f "tokens=1* delims=:" %%a in ("!LINE!") do (
+  set PART1=%%a
+  set PART2=%%b
+  %ECHOVARS.D% PART1 PART2
+  if defined PART2 if not "!PART2: 0=!"=="!PART2!" (
+    %DOECHO.D% set "ERROR=0"
+    exit /b 0
+  )
+)
+exit /b 1

 :#----------------------------------------------------------------------------#

@@ -1119,18 +1248,35 @@
 set "ERROR="
 set "^ERRORLEVEL=" &:# Make sure the first parsing phase does not expand this in the for 'command' below
 %FOREACHLINE% %%l in ('%XEXEC@% CMD ^& call echo./ERRORLEVEL/%%^^ERRORLEVEL%%') do (
-  set "LINE=%%l"
+  setlocal DisableDelayedExpansion
+  set "LINE=%%l" &:# Must be executed with expansion disabled, else ! are lost
+  call :Prep2ExpandVars LINE
+  setlocal EnableDelayedExpansion
+  for /f "delims=" %%m in ("!LINE!") do endlocal & endlocal & set "LINE=%%m"
   %ECHOVARS.D% LINE
+  set "IDENTIFIED=0"
   :# Special case of the exit code, appended to the data as a uniquely formatted text line " ERRORLEVEL N"
   if "!LINE:~0,12!"=="/ERRORLEVEL/" (
-    set "ERROR=!LINE:~12!"
-    echo.!LINE!
+    if not defined ERROR (
+      %DOECHO.D% set "ERROR=!LINE:~12!" & rem :# May also be forced to 0 when a 0-file count is detected below
+      echo.!LINE!
+    )
+    set "IDENTIFIED=1"
+  )
+  :# Special case of the count of values returned.
+  set "HEAD=!LINE:~0,4!"
+  if "!IDENTIFIED!"=="0" if not "!HEAD!"=="    " if not "!HEAD!"=="HKEY" (
+    call :dirs.ParseSummaryCount &:# If success, sets "ERROR=0" are returns 0
+    if not errorlevel 1 (
+      echo./ERRORLEVEL/0
+      set "IDENTIFIED=1"
+    )
   )
   :# Values are indented by 4 spaces.
-  set "HEAD=!LINE:~0,4!"
   set "LINE=!LINE:~4!"
   :# But extra lines of multi-lined values are indented by >20 spaces.
   set "HEAD2=!LINE:~0,4!"
+  set "TOKENS="
   if "!HEAD!"=="    " if not "!HEAD2!"=="    " (
     :# Some versions of reg.exe use 4 spaces as field separator; others use a TAB.
     :# Change the 4-spaces around the REG_XX type word to a TAB.
@@ -1139,17 +1285,22 @@
     :# Extract the value name as the first item before the first TAB.
     :# Names can contain spaces, but assume they don't contain TABs.
     for /f "tokens=1,2* delims=	" %%j in ("!TOKENS!") do (
+      setlocal DisableDelayedExpansion
       set "NAME=%%j"
-      if "!NAME!"=="(Default)" set "NAME="
       set "TYPE=%%k"
       set "VALUE=%%l"
+      setlocal EnableDelayedExpansion
+      if "!NAME!"=="(Default)" set "NAME="
       echo !NAME!/!TYPE!/!VALUE!
+      endlocal
+      endlocal
+      set "IDENTIFIED=1"
     )
   )
 )
 %RETURN% %ERROR%

-:# List sorted values. Args: [-c] [-p PATTERN] [-v] [-cb CALLBACK] KEY [RETVAR]
+:# List sorted values. Args: [-c] [-p PATTERN] [-a] [-cb CALLBACK] KEY [RETVAR]
 :values
 :files
 %FUNCTION% EnableExtensions EnableDelayedExpansion
@@ -1178,16 +1329,34 @@
 set "ERROR="
 set CMD=:GetValues "!KEY!" !OPTS!
 %FOREACHLINE% %%l in ('%XCALL@% CMD ^| sort') do (
-  set "LINE=%%l"
+  setlocal DisableDelayedExpansion
+  set "LINE=%%l" &:# Must be executed with expansion disabled, else ! are lost
+  call :Prep2ExpandVars LINE
+  setlocal EnableDelayedExpansion
+  for /f "delims=" %%m in ("!LINE!") do endlocal & endlocal & set "LINE=%%m"
   %ECHOVARS.D% LINE
   for /f "tokens=1,2* delims=/" %%j in ("-!LINE!") do ( :# Prepend a - to make sure the NAME is never empty
+    setlocal DisableDelayedExpansion
     set "NAME=%%j"
-    set "NAME=!NAME:~1!" &:# Remove the - inserted above, possibly leaving an empty name
     set "TYPE=%%k"
     set "VALUE=%%l"
+    call :Prep2ExpandVars NAME TYPE VALUE
+    setlocal EnableDelayedExpansion
+    for /f "delims=" %%n in ("!NAME!") do (
+      for /f "delims=" %%t in ("!TYPE!") do (
+	for /f "delims=" %%v in ("-!VALUE!") do ( :# Prepend a - to make sure the VALUE is never empty
+	  endlocal & endlocal
+          set "NAME=%%n"
+          set "TYPE=%%t"
+          set "VALUE=%%v"
+        )
+      )
+    )
+    set "NAME=!NAME:~1!" &:# Remove the - inserted above, possibly leaving an empty name
+    set "VALUE=!VALUE:~1!" &:# Remove the - inserted above, possibly leaving an empty value
     %ECHOVARS.D% NAME TYPE VALUE
     if "!TYPE!"=="ERRORLEVEL" ( :# Special case of the exit code
-      set "ERROR=!VALUE!"
+      %DOECHO.D% set "ERROR=!VALUE!"
     ) else (			:# General case of all REG_* values
       if %DETAILS%==0 (
 	set "OUTPUT=!BEFORE!!NAME!"
@@ -1195,12 +1364,14 @@
 	set "OUTPUT=!NAME!/!TYPE!/!VALUE!"
       )
       if defined CALLBACK (
-	call %CALLBACK% "!NAME:%%=%%%%!" "!TYPE!" "!VALUE:%%=%%%%!"
+      	if defined NAME set "NAME=!NAME:%%=%%%%!"
+	call %CALLBACK% "!NAME!" "!TYPE!" VALUE
       ) else if defined RETVAR (
 	call :CondQuote OUTPUT
 	set "RETVAL=!RETVAL! !OUTPUT!"
       ) else (
-	echo.!OUTPUT!
+      	call :Prep2ExpandVars OUTPUT &:# Make sure %ECHO% displays tricky characters correctly
+	%ECHO% !OUTPUT!
       )
     )
   )
@@ -1222,24 +1393,29 @@
 set "KEY=%~1" & shift
 %ECHOVARS.D% KEY
 :# Then call subroutines to get subkeys, then values.
-call :dirs -cb :dirs.dirCB !ARGS:%%=%%%%!
+call :dirs -cb :dirs.dirCB !KEY:%%=%%%%!
 if errorlevel 1 %RETURN%
-call :files !ARGS:%%=%%%%! VALUES
+call :files -cb :dirs.fileCB !KEY:%%=%%%%!
 if errorlevel 1 %RETURN%
-for %%V in (!VALUES!) do (
-  if "%%~V"=="" ( :# The default value is returned as ""
-    echo ""
-  ) else (
-    echo.%%~V
-  )
-)
 %RETURN% 0

 :dirs.dirCB DIRNAME
 %FUNCTION% DisableDelayedExpansion
-set "NAME=%~1"
+set "NAME=%~1" &:# Quoting this set command doubles ^carets, which will then be halved in the %ECHO%
 setlocal EnableDelayedExpansion
-%ECHO% !NAME:%%=%%%%!\
+call :Prep2ExpandVars NAME &:# Make sure %ECHO% displays tricky characters correctly
+%ECHO% !NAME!\
+endlocal
+%RETURN% 0
+
+:dirs.fileCB NAME TYPE VALUEVAR
+%FUNCTION% DisableDelayedExpansion
+set "NAME=%~1" &:# Quoting this set command doubles ^carets, which will then be halved in the %ECHO%
+setlocal EnableDelayedExpansion
+if not defined NAME set "NAME="""
+call :Prep2ExpandVars NAME &:# Make sure %ECHO% displays tricky characters correctly
+%ECHO% !NAME!
+endlocal
 %RETURN% 0

 :#----------------------------------------------------------------------------#
@@ -1271,10 +1447,14 @@
 set "ERROR="
 set "^ERRORLEVEL=" &:# Make sure the first parsing phase does not expand this in the for 'command' below
 %FOREACHLINE% %%l in ('%XEXEC@% CMD ^& call echo. ERRORLEVEL %%^^ERRORLEVEL%%') do (
-  set "LINE=%%l"
+  setlocal DisableDelayedExpansion
+  set "LINE=%%l" &:# Must be executed with expansion disabled, else ! are lost
+  call :Prep2ExpandVars LINE
+  setlocal EnableDelayedExpansion
+  for /f "delims=" %%m in ("!LINE!") do endlocal & endlocal & set "LINE=%%m"
   %ECHOVARS.D% LINE
   :# Special case of the exit code, appended to the data as a uniquely formatted text line " ERRORLEVEL N"
-  if "!LINE:~0,12!"==" ERRORLEVEL " set "ERROR=!LINE:~12!"
+  if "!LINE:~0,12!"==" ERRORLEVEL " %DOECHO.D% set "ERROR=!LINE:~12!"
   :# Values are indented by 4 spaces.
   set "HEAD=!LINE:~0,4!"
   set "LINE=!LINE:~4!"
@@ -1288,9 +1468,23 @@
     :# Extract the value name as the first item before the first TAB.
     :# Names can contain spaces, but assume they don't contain TABs.
     for /f "tokens=1,2* delims=	" %%j in ("!TOKENS!") do (
+      setlocal DisableDelayedExpansion
       set "NAME=%%j"
       set "TYPE=%%k"
       set "VALUE=%%l"
+      call :Prep2ExpandVars NAME TYPE VALUE
+      setlocal EnableDelayedExpansion
+      for /f "delims=" %%n in ("!NAME!") do (
+	for /f "delims=" %%t in ("!TYPE!") do (
+	  for /f "delims=" %%v in ("-!VALUE!") do ( :# Prepend a - to make sure the VALUE is never empty
+	    endlocal & endlocal
+	    set "NAME=%%n"
+	    set "TYPE=%%t"
+	    set "VALUE=%%v"
+	  )
+	)
+      )
+      set "VALUE=!VALUE:~1!" &:# Remove the - inserted above, possibly leaving an empty value
       %ECHOVARS.D% NAME TYPE VALUE
     )
     set BEFORE=
@@ -1298,7 +1492,9 @@
       set "%RETVAR%=!VALUE!"
     ) else (
       %IF_VERBOSE% set "BEFORE=!KEY!\!NAME! = "
-      echo.!BEFORE!!VALUE!
+      set "OUTPUT=!BEFORE!!VALUE!"
+      call :Prep2ExpandVars OUTPUT &:# Make sure %ECHO% displays tricky characters correctly
+      %ECHO% OUTPUT
     )
   )
 )
@@ -1309,6 +1505,8 @@
 :# Non-recursive show. %1=Parent key pathname.
 :show
 :showdir
+:dump
+:dumpdir
 %FUNCTION% EnableExtensions EnableDelayedExpansion
 set "KEY=%~1" & shift
 %ECHOVARS.D% KEY
@@ -1327,20 +1525,29 @@
 set "SUBKEY\=%~1\"
 setlocal EnableDelayedExpansion
 call :CondQuote SUBKEY\
-%ECHO% !SUBKEY\:%%=%%%%! {}
+call :Prep2ExpandVars SUBKEY &:# Make sure %ECHO% displays tricky characters correctly
+%ECHO% !SUBKEY! {}
+endlocal
 %RETURN% 0

-:show.fileCB NAME TYPE VALUE
+:show.fileCB NAME TYPE VALUEVAR
 %FUNCTION% DisableDelayedExpansion
 set "NAME=%~1"
 set "TYPE=%~2"
-set "VALUE=%~3"
 setlocal EnableDelayedExpansion
+set ^"VALUE=!%~3!^"
 call :CondQuote NAME
-call :CondQuote VALUE
+if ^"!VALUE:"=!"=="!VALUE!" (
+  call :CondQuote VALUE
+) else ( :# TO DO: A fully SML-compatible conversion of the string into an {SML block}
+  set ^"VALUE={!VALUE!}^"
+)
 set "ATTRS= "
 %IF_VERBOSE% SET "ATTRS= type=!TYPE! "
-%ECHO% !NAME:%%=%%%%!!ATTRS!!VALUE:%%=%%%%!
+set "OUTPUT=!NAME!!ATTRS!!VALUE!"
+call :Prep2ExpandVars OUTPUT &:# Make sure %ECHO% displays tricky characters correctly
+%ECHO% !OUTPUT!
+endlocal
 %RETURN% 0

 :#----------------------------------------------------------------------------#
@@ -1348,30 +1555,35 @@
 :# Recursive show. %1=Parent key pathname.
 :tree
 :showtree
+:dumptree
 %FUNCTION% EnableExtensions EnableDelayedExpansion
-set "KEY=%~1" & shift
+:# Do not quote this set command, else ^carets would be doubled
+set KEY=%~1
 %ECHOVARS.D% KEY
 set "EXEC=!EXEC! -V"		&:# Do not display the commands in verbose mode
 set "ECHO.XVD=%ECHO.XD%"	&:# Do not display the commands in verbose mode
 :# Then call subroutines to get subkeys, then values.
 call :dirs -cb :tree.dirCB "!KEY:%%=%%%%!"
 if errorlevel 1 %RETURN%
-set "ATTRS= "
 call :files -cb :show.fileCB "!KEY:%%=%%%%!"
 if errorlevel 1 %RETURN%
 %RETURN% 0

 :tree.dirCB DIRNAME
 %FUNCTION% DisableDelayedExpansion
-set "SUBKEY=%~1"
+:# Do not quote these set commands, else ^carets would be doubled
+set SUBKEY=%~1
+set SUBKEY\=%~1\
 setlocal EnableDelayedExpansion
-set "SUBKEY\=!SUBKEY!\"
 call :CondQuote SUBKEY\
-%ECHO% !SUBKEY\:%%=%%%%! {
+call :Prep2ExpandVars SUBKEY\ &:# Make sure %ECHO% displays tricky characters correctly
+%ECHO% !SUBKEY\! {
   if "%DEBUG%"=="0" set "INDENT=%INDENT%  "
-  call :tree "!KEY:%%=%%%%!\!SUBKEY:%%=%%%%!"
+  set "SUBKEY=!KEY!\!SUBKEY!"
+  call :tree "!SUBKEY:%%=%%%%!"
   if "%DEBUG%"=="0" set "INDENT=%INDENT:~2%"
 %ECHO% }
+endlocal
 %RETURN% 0

 :#----------------------------------------------------------------------------#
@@ -1468,6 +1680,36 @@
 call :set "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey" "%COMPUTER%\!KEY!" >NUL
 %EXEC% start /b regedit
 %RETURN%
+
+:#----------------------------------------------------------------------------#
+
+:# Test a number of tricky cases
+:test
+call :CondQuote ARG0
+echo -----------------------------------------------------------
+echo A key with subkeys containing the %% character:
+%EXEC% call %ARG0% dirs HKCU\Console
+echo.
+echo -----------------------------------------------------------
+echo A key with data containing the %% character:
+%EXEC% call %ARG0% show HKCU\Environment
+echo.
+echo -----------------------------------------------------------
+echo A key with subkeys containing the ^^ character:
+%EXEC% call %ARG0% dirs "HKCU\Control Panel\Desktop\PerMonitorSettings"
+echo.
+echo -----------------------------------------------------------
+echo A key with data containing the ^^ character:
+%EXEC% call %ARG0% show "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Extensions"
+echo.
+echo -----------------------------------------------------------
+echo A key with subkeys containing the ^^^! character:
+%EXEC% call %ARG0% dir HKLM\SOFTWARE\Microsoft\DirectDraw\Compatibility
+echo.
+echo -----------------------------------------------------------
+echo A key with subkeys containing the ^^^! character:
+%EXEC% call %ARG0% show "HKCR\Acrobat.aaui\shell\Open\command"
+exit /b

 :#----------------------------------------------------------------------------#
 :#                                                                            #
@@ -1556,7 +1798,4 @@

 :# Execute the requested command
 :go
-call :check_exts
-if errorlevel 1 exit /b
-
 call :%ACTION% "!KEY!" !OPTS!


remove obsolete build.bat

remove obsolete build.bat

--- examples/cube/build.bat
+++ examples/cube/build.bat
@@ -1,11 +0,0 @@
-@echo ============================
-@echo LightEngine 3D: cube example
-@echo ============================
-@echo Compiling and linking
-@echo.
-g++.exe -march=pentium4 -Wall -m32 -ffast-math -mfpmath=sse -fno-exceptions -fno-rtti -fno-stack-protector -fno-math-errno -fno-ident -ffunction-sections -D__MSVCRT_VERSION__=0x0700 -O2 -I..\..\..\le3d "cube_win.cpp" ..\..\..\le3d\engine\*.cpp  ..\..\..\le3d\tools\*.cpp -o cube.exe -lgdi32 -lwinmm -Wl,--gc-sections -static-libgcc -s
-@echo.
-@echo off
-pause
-@echo.
-cube.exe