Batch script to download and extract Node.JS and NPM packagesRuby install script; packages+installs as a .deb...

Using only 1s, make 29 with the minimum number of digits

Recrystallisation of dibenzylideneacetone

What does Cypher mean when he says Neo is "gonna pop"?

What is the purpose of easy combat scenarios that don't need resource expenditure?

How to avoid being sexist when trying to employ someone to function in a very sexist environment?

What to do if authors don't respond to my serious concerns about their paper?

Why zero tolerance on nudity in space?

Cat is tipping over bed-side lamps during the night

A universal method for left-hand alignment of a sequence of equalities

Why don't American passenger airlines operate dedicated cargo flights any more?

Contest math problem about crossing out numbers in the table

Does Windows 10's telemetry include sending *.doc files if Word crashed?

Slow moving projectiles from a hand-held weapon - how do they reach the target?

What kind of hardware implements Fourier transform?

How to prevent users from executing commands through browser URL

Can a person refuse a presidential pardon?

Parsing a string of key-value pairs as a dictionary

Does fast page mode apply to ROM?

How do you funnel food off a cutting board?

Cryptic with missing capitals

How would an AI self awareness kill switch work?

Disable the ">" operator in Rstudio linux terminal

Why is "points exist" not an axiom in geometry?

What is this metal M-shaped device for?



Batch script to download and extract Node.JS and NPM packages


Ruby install script; packages+installs as a .deb or .rpm from sourceDownload a file and update the current downloaded percentageBatch file-download script - is it necessary to re-phrase commands?Simple POST function in ClojureScript and Node.jsNode.js parallel file download, the ES6 wayBatch script to make folders hiddenDOS batch script to open file explorerGenerate URLs, Download, extract and add filesNode.js Data-Completion script“Function” to extract a file in Batch













0












$begingroup$


The following is my first real attempt at batch scripting, and I'm new to it so I'm not sure whether what I've done is to best practice. The code works, and I'm open to suggestions.



Basically the following code allows someone to download Node.js and npm per project, a requirement we have so that we can run multiple versions of Node and npm at the same time. The script also means that setting up development environments is easier, so there are a few goals this script is trying to achieve.



@ECHO OFF

REM Need to test on Azure DevOps, CruiseControl.NET, etc.
REM Test with spaces in paths...

SETLOCAL

SET "NPM_REGISTRY=https://registry.npmjs.org"
SET "ZIP_DOWNLOAD_URL=https://chocolatey.org/7za.exe"

SET "NODE_EXE_ARCH=x64"
SET "NODE_PACKAGE_VERSION=11.10.0"
SET "NPM_PACKAGE_VERSION=6.8.0"

SET "DOWNLOAD_CACHE_PATH=%temp%NpmScratch"
SET "ZIP_EXE_DOWNLOAD=%DOWNLOAD_CACHE_PATH%7za.exe"

SET "NODE_PACKAGE_PATH=%~dp0."
SET "NODE_MODULES_PATH=%NODE_PACKAGE_PATH%node_modules"
SET "NPM_PACKAGE_PATH=%NODE_MODULES_PATH%npm"

SET "NODE_EXE=%NODE_PACKAGE_PATH%node.exe"
SET "NPM_CLI_JS=%NPM_PACKAGE_PATH%binnpm-cli.js"

SET "DELETE_NODE_MODULES="
SET "DOWNLOAD_NODE="
SET "DOWNLOAD_NPM="

IF NOT EXIST "%NODE_EXE%" (
SET DOWNLOAD_NODE=1
)

IF NOT EXIST "%NPM_CLI_JS%" (
SET DELETE_NODE_MODULES=1
SET DOWNLOAD_NPM=1
)

ECHO DELETE_NODE_MODULES=%DELETE_NODE_MODULES%
ECHO DOWNLOAD_NODE=%DOWNLOAD_NODE%
ECHO DOWNLOAD_NPM=%DOWNLOAD_NPM%

IF DEFINED DELETE_NODE_MODULES (
CALL :clean_dir %NODE_MODULES_PATH%
)

SET "NODE_PACKAGE_FILENAME=node-win-%NODE_EXE_ARCH%-%NODE_PACKAGE_VERSION%.tgz"
SET "NODE_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NODE_PACKAGE_FILENAME%"
SET "NODE_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%"
SET "NODE_EXE_DOWNLOAD_CACHE_PATH=%NODE_DOWNLOAD_CACHE_PATH%binnode.exe"
IF DEFINED DOWNLOAD_NODE (
CALL :create_dir %DOWNLOAD_CACHE_PATH%
IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
ECHO "Cache directory missing"
EXIT %ERRORLEVEL%
)

CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
ECHO "Zip download failed"
EXIT %ERRORLEVEL%
)

CALL :download %NPM_REGISTRY%/node-win-%NODE_EXE_ARCH%/-/%NODE_PACKAGE_FILENAME% %NODE_PACKAGE_DOWNLOAD_PATH%
IF NOT EXIST "%NODE_PACKAGE_DOWNLOAD_PATH%" (
ECHO "Node.js download failed"
EXIT %ERRORLEVEL%
)

IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NODE_PACKAGE_DOWNLOAD_PATH% %DOWNLOAD_CACHE_PATH%
IF NOT EXIST "%DOWNLOAD_CACHE_PATH%packagebinnode.exe" (
ECHO "Extracting Node,js package failed"
EXIT %ERRORLEVEL%
)

CALL :delete_dir %NODE_DOWNLOAD_CACHE_PATH%
IF EXIST "%NODE_DOWNLOAD_CACHE_PATH%" (
ECHO "Failed to delete %NODE_DOWNLOAD_CACHE_PATH%"
EXIT %ERRORLEVEL%
)

CALL :move %DOWNLOAD_CACHE_PATH%package %NODE_DOWNLOAD_CACHE_PATH%
IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
ECHO "Renaming Node.js package directory failed"
EXIT %ERRORLEVEL%
)
)

IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
ECHO "Cached Node.js package directory missing"
EXIT %ERRORLEVEL%
)

CALL :delete_file %NODE_EXE%
IF EXIST "%NODE_EXE%" (
ECHO "Failed to delete %NODE_EXE%"
EXIT %ERRORLEVEL%
)

CALL :copy_file %DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%binnode.exe %NODE_EXE%
IF NOT EXIST "%NODE_EXE%" (
ECHO "Copying Node exe failed"
EXIT %ERRORLEVEL%
)
)

SET "NPM_PACKAGE_FILENAME=npm-%NPM_PACKAGE_VERSION%.tgz"
SET "NPM_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NPM_PACKAGE_FILENAME%"
SET "NPM_CLI_JS_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%npm-%NPM_PACKAGE_VERSION%binnpm-cli.js"
IF DEFINED DOWNLOAD_NPM (
CALL :create_dir %DOWNLOAD_CACHE_PATH%
IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
ECHO "Cache directory missing"
EXIT %ERRORLEVEL%
)

CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
ECHO "Zip download failed"
EXIT %ERRORLEVEL%
)

CALL :download %NPM_REGISTRY%/npm/-/%NPM_PACKAGE_FILENAME% %NPM_PACKAGE_DOWNLOAD_PATH%
IF NOT EXIST "%NPM_PACKAGE_DOWNLOAD_PATH%" (
ECHO "npm download failed"
EXIT %ERRORLEVEL%
)

CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NPM_PACKAGE_DOWNLOAD_PATH% %NPM_PACKAGE_PATH%..
IF NOT EXIST "%NODE_MODULES_PATH%packagebinnpm-cli.js" (
ECHO "Extracting npm package failed"
EXIT %ERRORLEVEL%
)

CALL :delete_dir %NPM_PACKAGE_PATH%
IF EXIST "%NPM_PACKAGE_PATH%" (
ECHO "Failed to delete %NPM_PACKAGE_PATH%"
EXIT %ERRORLEVEL%
)

CALL :move %NPM_PACKAGE_PATH%..package %NPM_PACKAGE_PATH%
IF NOT EXIST "%NPM_PACKAGE_PATH%" (
ECHO "Renaming npm package directory failed"
EXIT %ERRORLEVEL%
)
)

EXIT /B %ERRORLEVEL%

:clean_dir
IF EXIST "%~1" (
ECHO "Cleaning directory %~1"
CALL CMD /C "MKDIR %temp%.empty 2>NUL"
CALL CMD /C "ROBOCOPY %temp%.empty %~1 /MIR >NUL"
)
EXIT /B 0

:delete_file
IF EXIST "%~1" (
CALL ECHO "Deleting file %~1"
CALL DEL "%~1"
)
EXIT /B 0

:delete_dir
IF EXIST "%~1" (
ECHO "Deleting directory %~1"
CALL :clean_dir "%~1" >NUL
CALL RMDIR "%~1"
)
EXIT /B 0

:create_dir
IF NOT EXIST "%~1" (
ECHO "Creating directory %~1"
CALL MKDIR "%~1"
)
EXIT /B 0

:move
IF NOT EXIST "%~2" (
ECHO "Moving %~1 to %2"
CALL MOVE "%~1" "%~2"
)
EXIT /B 0

:copy_file
IF NOT EXIST "%~2" (
ECHO "Copying %~1 to %~2"
CALL COPY "%~1" "%~2"
)
EXIT /B 0

:copy_dir
IF NOT EXIST "%~2" (
ECHO "Copying %~1 to %2"
CALL robocopy "%~1" "%~2" /E >NUL
)
EXIT /B 0

:download
IF NOT EXIST "%~2" (
ECHO "Downloading %~1 to %~2"
CALL bitsadmin.exe /transfer "Download" %~1 "%~2"
)
EXIT /B 0

REM %~1 = %ZIP_EXE_DOWNLOAD%
REM %~2 = %NODE_PACKAGE_DOWNLOAD_PATH%
REM %~3 = %DOWNLOAD_CACHE_PATH%
:extract_archive
ECHO "Extracting %~2 to %~3"
CALL CMD /C "%~1 x %~2 -so | %~1 x -aoa -si -ttar -o"%~3""
EXIT /B 0









share|improve this question











$endgroup$

















    0












    $begingroup$


    The following is my first real attempt at batch scripting, and I'm new to it so I'm not sure whether what I've done is to best practice. The code works, and I'm open to suggestions.



    Basically the following code allows someone to download Node.js and npm per project, a requirement we have so that we can run multiple versions of Node and npm at the same time. The script also means that setting up development environments is easier, so there are a few goals this script is trying to achieve.



    @ECHO OFF

    REM Need to test on Azure DevOps, CruiseControl.NET, etc.
    REM Test with spaces in paths...

    SETLOCAL

    SET "NPM_REGISTRY=https://registry.npmjs.org"
    SET "ZIP_DOWNLOAD_URL=https://chocolatey.org/7za.exe"

    SET "NODE_EXE_ARCH=x64"
    SET "NODE_PACKAGE_VERSION=11.10.0"
    SET "NPM_PACKAGE_VERSION=6.8.0"

    SET "DOWNLOAD_CACHE_PATH=%temp%NpmScratch"
    SET "ZIP_EXE_DOWNLOAD=%DOWNLOAD_CACHE_PATH%7za.exe"

    SET "NODE_PACKAGE_PATH=%~dp0."
    SET "NODE_MODULES_PATH=%NODE_PACKAGE_PATH%node_modules"
    SET "NPM_PACKAGE_PATH=%NODE_MODULES_PATH%npm"

    SET "NODE_EXE=%NODE_PACKAGE_PATH%node.exe"
    SET "NPM_CLI_JS=%NPM_PACKAGE_PATH%binnpm-cli.js"

    SET "DELETE_NODE_MODULES="
    SET "DOWNLOAD_NODE="
    SET "DOWNLOAD_NPM="

    IF NOT EXIST "%NODE_EXE%" (
    SET DOWNLOAD_NODE=1
    )

    IF NOT EXIST "%NPM_CLI_JS%" (
    SET DELETE_NODE_MODULES=1
    SET DOWNLOAD_NPM=1
    )

    ECHO DELETE_NODE_MODULES=%DELETE_NODE_MODULES%
    ECHO DOWNLOAD_NODE=%DOWNLOAD_NODE%
    ECHO DOWNLOAD_NPM=%DOWNLOAD_NPM%

    IF DEFINED DELETE_NODE_MODULES (
    CALL :clean_dir %NODE_MODULES_PATH%
    )

    SET "NODE_PACKAGE_FILENAME=node-win-%NODE_EXE_ARCH%-%NODE_PACKAGE_VERSION%.tgz"
    SET "NODE_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NODE_PACKAGE_FILENAME%"
    SET "NODE_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%"
    SET "NODE_EXE_DOWNLOAD_CACHE_PATH=%NODE_DOWNLOAD_CACHE_PATH%binnode.exe"
    IF DEFINED DOWNLOAD_NODE (
    CALL :create_dir %DOWNLOAD_CACHE_PATH%
    IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
    ECHO "Cache directory missing"
    EXIT %ERRORLEVEL%
    )

    CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
    IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
    ECHO "Zip download failed"
    EXIT %ERRORLEVEL%
    )

    CALL :download %NPM_REGISTRY%/node-win-%NODE_EXE_ARCH%/-/%NODE_PACKAGE_FILENAME% %NODE_PACKAGE_DOWNLOAD_PATH%
    IF NOT EXIST "%NODE_PACKAGE_DOWNLOAD_PATH%" (
    ECHO "Node.js download failed"
    EXIT %ERRORLEVEL%
    )

    IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
    CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NODE_PACKAGE_DOWNLOAD_PATH% %DOWNLOAD_CACHE_PATH%
    IF NOT EXIST "%DOWNLOAD_CACHE_PATH%packagebinnode.exe" (
    ECHO "Extracting Node,js package failed"
    EXIT %ERRORLEVEL%
    )

    CALL :delete_dir %NODE_DOWNLOAD_CACHE_PATH%
    IF EXIST "%NODE_DOWNLOAD_CACHE_PATH%" (
    ECHO "Failed to delete %NODE_DOWNLOAD_CACHE_PATH%"
    EXIT %ERRORLEVEL%
    )

    CALL :move %DOWNLOAD_CACHE_PATH%package %NODE_DOWNLOAD_CACHE_PATH%
    IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
    ECHO "Renaming Node.js package directory failed"
    EXIT %ERRORLEVEL%
    )
    )

    IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
    ECHO "Cached Node.js package directory missing"
    EXIT %ERRORLEVEL%
    )

    CALL :delete_file %NODE_EXE%
    IF EXIST "%NODE_EXE%" (
    ECHO "Failed to delete %NODE_EXE%"
    EXIT %ERRORLEVEL%
    )

    CALL :copy_file %DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%binnode.exe %NODE_EXE%
    IF NOT EXIST "%NODE_EXE%" (
    ECHO "Copying Node exe failed"
    EXIT %ERRORLEVEL%
    )
    )

    SET "NPM_PACKAGE_FILENAME=npm-%NPM_PACKAGE_VERSION%.tgz"
    SET "NPM_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NPM_PACKAGE_FILENAME%"
    SET "NPM_CLI_JS_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%npm-%NPM_PACKAGE_VERSION%binnpm-cli.js"
    IF DEFINED DOWNLOAD_NPM (
    CALL :create_dir %DOWNLOAD_CACHE_PATH%
    IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
    ECHO "Cache directory missing"
    EXIT %ERRORLEVEL%
    )

    CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
    IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
    ECHO "Zip download failed"
    EXIT %ERRORLEVEL%
    )

    CALL :download %NPM_REGISTRY%/npm/-/%NPM_PACKAGE_FILENAME% %NPM_PACKAGE_DOWNLOAD_PATH%
    IF NOT EXIST "%NPM_PACKAGE_DOWNLOAD_PATH%" (
    ECHO "npm download failed"
    EXIT %ERRORLEVEL%
    )

    CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NPM_PACKAGE_DOWNLOAD_PATH% %NPM_PACKAGE_PATH%..
    IF NOT EXIST "%NODE_MODULES_PATH%packagebinnpm-cli.js" (
    ECHO "Extracting npm package failed"
    EXIT %ERRORLEVEL%
    )

    CALL :delete_dir %NPM_PACKAGE_PATH%
    IF EXIST "%NPM_PACKAGE_PATH%" (
    ECHO "Failed to delete %NPM_PACKAGE_PATH%"
    EXIT %ERRORLEVEL%
    )

    CALL :move %NPM_PACKAGE_PATH%..package %NPM_PACKAGE_PATH%
    IF NOT EXIST "%NPM_PACKAGE_PATH%" (
    ECHO "Renaming npm package directory failed"
    EXIT %ERRORLEVEL%
    )
    )

    EXIT /B %ERRORLEVEL%

    :clean_dir
    IF EXIST "%~1" (
    ECHO "Cleaning directory %~1"
    CALL CMD /C "MKDIR %temp%.empty 2>NUL"
    CALL CMD /C "ROBOCOPY %temp%.empty %~1 /MIR >NUL"
    )
    EXIT /B 0

    :delete_file
    IF EXIST "%~1" (
    CALL ECHO "Deleting file %~1"
    CALL DEL "%~1"
    )
    EXIT /B 0

    :delete_dir
    IF EXIST "%~1" (
    ECHO "Deleting directory %~1"
    CALL :clean_dir "%~1" >NUL
    CALL RMDIR "%~1"
    )
    EXIT /B 0

    :create_dir
    IF NOT EXIST "%~1" (
    ECHO "Creating directory %~1"
    CALL MKDIR "%~1"
    )
    EXIT /B 0

    :move
    IF NOT EXIST "%~2" (
    ECHO "Moving %~1 to %2"
    CALL MOVE "%~1" "%~2"
    )
    EXIT /B 0

    :copy_file
    IF NOT EXIST "%~2" (
    ECHO "Copying %~1 to %~2"
    CALL COPY "%~1" "%~2"
    )
    EXIT /B 0

    :copy_dir
    IF NOT EXIST "%~2" (
    ECHO "Copying %~1 to %2"
    CALL robocopy "%~1" "%~2" /E >NUL
    )
    EXIT /B 0

    :download
    IF NOT EXIST "%~2" (
    ECHO "Downloading %~1 to %~2"
    CALL bitsadmin.exe /transfer "Download" %~1 "%~2"
    )
    EXIT /B 0

    REM %~1 = %ZIP_EXE_DOWNLOAD%
    REM %~2 = %NODE_PACKAGE_DOWNLOAD_PATH%
    REM %~3 = %DOWNLOAD_CACHE_PATH%
    :extract_archive
    ECHO "Extracting %~2 to %~3"
    CALL CMD /C "%~1 x %~2 -so | %~1 x -aoa -si -ttar -o"%~3""
    EXIT /B 0









    share|improve this question











    $endgroup$















      0












      0








      0





      $begingroup$


      The following is my first real attempt at batch scripting, and I'm new to it so I'm not sure whether what I've done is to best practice. The code works, and I'm open to suggestions.



      Basically the following code allows someone to download Node.js and npm per project, a requirement we have so that we can run multiple versions of Node and npm at the same time. The script also means that setting up development environments is easier, so there are a few goals this script is trying to achieve.



      @ECHO OFF

      REM Need to test on Azure DevOps, CruiseControl.NET, etc.
      REM Test with spaces in paths...

      SETLOCAL

      SET "NPM_REGISTRY=https://registry.npmjs.org"
      SET "ZIP_DOWNLOAD_URL=https://chocolatey.org/7za.exe"

      SET "NODE_EXE_ARCH=x64"
      SET "NODE_PACKAGE_VERSION=11.10.0"
      SET "NPM_PACKAGE_VERSION=6.8.0"

      SET "DOWNLOAD_CACHE_PATH=%temp%NpmScratch"
      SET "ZIP_EXE_DOWNLOAD=%DOWNLOAD_CACHE_PATH%7za.exe"

      SET "NODE_PACKAGE_PATH=%~dp0."
      SET "NODE_MODULES_PATH=%NODE_PACKAGE_PATH%node_modules"
      SET "NPM_PACKAGE_PATH=%NODE_MODULES_PATH%npm"

      SET "NODE_EXE=%NODE_PACKAGE_PATH%node.exe"
      SET "NPM_CLI_JS=%NPM_PACKAGE_PATH%binnpm-cli.js"

      SET "DELETE_NODE_MODULES="
      SET "DOWNLOAD_NODE="
      SET "DOWNLOAD_NPM="

      IF NOT EXIST "%NODE_EXE%" (
      SET DOWNLOAD_NODE=1
      )

      IF NOT EXIST "%NPM_CLI_JS%" (
      SET DELETE_NODE_MODULES=1
      SET DOWNLOAD_NPM=1
      )

      ECHO DELETE_NODE_MODULES=%DELETE_NODE_MODULES%
      ECHO DOWNLOAD_NODE=%DOWNLOAD_NODE%
      ECHO DOWNLOAD_NPM=%DOWNLOAD_NPM%

      IF DEFINED DELETE_NODE_MODULES (
      CALL :clean_dir %NODE_MODULES_PATH%
      )

      SET "NODE_PACKAGE_FILENAME=node-win-%NODE_EXE_ARCH%-%NODE_PACKAGE_VERSION%.tgz"
      SET "NODE_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NODE_PACKAGE_FILENAME%"
      SET "NODE_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%"
      SET "NODE_EXE_DOWNLOAD_CACHE_PATH=%NODE_DOWNLOAD_CACHE_PATH%binnode.exe"
      IF DEFINED DOWNLOAD_NODE (
      CALL :create_dir %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
      ECHO "Cache directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
      IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
      ECHO "Zip download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :download %NPM_REGISTRY%/node-win-%NODE_EXE_ARCH%/-/%NODE_PACKAGE_FILENAME% %NODE_PACKAGE_DOWNLOAD_PATH%
      IF NOT EXIST "%NODE_PACKAGE_DOWNLOAD_PATH%" (
      ECHO "Node.js download failed"
      EXIT %ERRORLEVEL%
      )

      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NODE_PACKAGE_DOWNLOAD_PATH% %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%packagebinnode.exe" (
      ECHO "Extracting Node,js package failed"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_dir %NODE_DOWNLOAD_CACHE_PATH%
      IF EXIST "%NODE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Failed to delete %NODE_DOWNLOAD_CACHE_PATH%"
      EXIT %ERRORLEVEL%
      )

      CALL :move %DOWNLOAD_CACHE_PATH%package %NODE_DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Renaming Node.js package directory failed"
      EXIT %ERRORLEVEL%
      )
      )

      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Cached Node.js package directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_file %NODE_EXE%
      IF EXIST "%NODE_EXE%" (
      ECHO "Failed to delete %NODE_EXE%"
      EXIT %ERRORLEVEL%
      )

      CALL :copy_file %DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%binnode.exe %NODE_EXE%
      IF NOT EXIST "%NODE_EXE%" (
      ECHO "Copying Node exe failed"
      EXIT %ERRORLEVEL%
      )
      )

      SET "NPM_PACKAGE_FILENAME=npm-%NPM_PACKAGE_VERSION%.tgz"
      SET "NPM_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NPM_PACKAGE_FILENAME%"
      SET "NPM_CLI_JS_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%npm-%NPM_PACKAGE_VERSION%binnpm-cli.js"
      IF DEFINED DOWNLOAD_NPM (
      CALL :create_dir %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
      ECHO "Cache directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
      IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
      ECHO "Zip download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :download %NPM_REGISTRY%/npm/-/%NPM_PACKAGE_FILENAME% %NPM_PACKAGE_DOWNLOAD_PATH%
      IF NOT EXIST "%NPM_PACKAGE_DOWNLOAD_PATH%" (
      ECHO "npm download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NPM_PACKAGE_DOWNLOAD_PATH% %NPM_PACKAGE_PATH%..
      IF NOT EXIST "%NODE_MODULES_PATH%packagebinnpm-cli.js" (
      ECHO "Extracting npm package failed"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_dir %NPM_PACKAGE_PATH%
      IF EXIST "%NPM_PACKAGE_PATH%" (
      ECHO "Failed to delete %NPM_PACKAGE_PATH%"
      EXIT %ERRORLEVEL%
      )

      CALL :move %NPM_PACKAGE_PATH%..package %NPM_PACKAGE_PATH%
      IF NOT EXIST "%NPM_PACKAGE_PATH%" (
      ECHO "Renaming npm package directory failed"
      EXIT %ERRORLEVEL%
      )
      )

      EXIT /B %ERRORLEVEL%

      :clean_dir
      IF EXIST "%~1" (
      ECHO "Cleaning directory %~1"
      CALL CMD /C "MKDIR %temp%.empty 2>NUL"
      CALL CMD /C "ROBOCOPY %temp%.empty %~1 /MIR >NUL"
      )
      EXIT /B 0

      :delete_file
      IF EXIST "%~1" (
      CALL ECHO "Deleting file %~1"
      CALL DEL "%~1"
      )
      EXIT /B 0

      :delete_dir
      IF EXIST "%~1" (
      ECHO "Deleting directory %~1"
      CALL :clean_dir "%~1" >NUL
      CALL RMDIR "%~1"
      )
      EXIT /B 0

      :create_dir
      IF NOT EXIST "%~1" (
      ECHO "Creating directory %~1"
      CALL MKDIR "%~1"
      )
      EXIT /B 0

      :move
      IF NOT EXIST "%~2" (
      ECHO "Moving %~1 to %2"
      CALL MOVE "%~1" "%~2"
      )
      EXIT /B 0

      :copy_file
      IF NOT EXIST "%~2" (
      ECHO "Copying %~1 to %~2"
      CALL COPY "%~1" "%~2"
      )
      EXIT /B 0

      :copy_dir
      IF NOT EXIST "%~2" (
      ECHO "Copying %~1 to %2"
      CALL robocopy "%~1" "%~2" /E >NUL
      )
      EXIT /B 0

      :download
      IF NOT EXIST "%~2" (
      ECHO "Downloading %~1 to %~2"
      CALL bitsadmin.exe /transfer "Download" %~1 "%~2"
      )
      EXIT /B 0

      REM %~1 = %ZIP_EXE_DOWNLOAD%
      REM %~2 = %NODE_PACKAGE_DOWNLOAD_PATH%
      REM %~3 = %DOWNLOAD_CACHE_PATH%
      :extract_archive
      ECHO "Extracting %~2 to %~3"
      CALL CMD /C "%~1 x %~2 -so | %~1 x -aoa -si -ttar -o"%~3""
      EXIT /B 0









      share|improve this question











      $endgroup$




      The following is my first real attempt at batch scripting, and I'm new to it so I'm not sure whether what I've done is to best practice. The code works, and I'm open to suggestions.



      Basically the following code allows someone to download Node.js and npm per project, a requirement we have so that we can run multiple versions of Node and npm at the same time. The script also means that setting up development environments is easier, so there are a few goals this script is trying to achieve.



      @ECHO OFF

      REM Need to test on Azure DevOps, CruiseControl.NET, etc.
      REM Test with spaces in paths...

      SETLOCAL

      SET "NPM_REGISTRY=https://registry.npmjs.org"
      SET "ZIP_DOWNLOAD_URL=https://chocolatey.org/7za.exe"

      SET "NODE_EXE_ARCH=x64"
      SET "NODE_PACKAGE_VERSION=11.10.0"
      SET "NPM_PACKAGE_VERSION=6.8.0"

      SET "DOWNLOAD_CACHE_PATH=%temp%NpmScratch"
      SET "ZIP_EXE_DOWNLOAD=%DOWNLOAD_CACHE_PATH%7za.exe"

      SET "NODE_PACKAGE_PATH=%~dp0."
      SET "NODE_MODULES_PATH=%NODE_PACKAGE_PATH%node_modules"
      SET "NPM_PACKAGE_PATH=%NODE_MODULES_PATH%npm"

      SET "NODE_EXE=%NODE_PACKAGE_PATH%node.exe"
      SET "NPM_CLI_JS=%NPM_PACKAGE_PATH%binnpm-cli.js"

      SET "DELETE_NODE_MODULES="
      SET "DOWNLOAD_NODE="
      SET "DOWNLOAD_NPM="

      IF NOT EXIST "%NODE_EXE%" (
      SET DOWNLOAD_NODE=1
      )

      IF NOT EXIST "%NPM_CLI_JS%" (
      SET DELETE_NODE_MODULES=1
      SET DOWNLOAD_NPM=1
      )

      ECHO DELETE_NODE_MODULES=%DELETE_NODE_MODULES%
      ECHO DOWNLOAD_NODE=%DOWNLOAD_NODE%
      ECHO DOWNLOAD_NPM=%DOWNLOAD_NPM%

      IF DEFINED DELETE_NODE_MODULES (
      CALL :clean_dir %NODE_MODULES_PATH%
      )

      SET "NODE_PACKAGE_FILENAME=node-win-%NODE_EXE_ARCH%-%NODE_PACKAGE_VERSION%.tgz"
      SET "NODE_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NODE_PACKAGE_FILENAME%"
      SET "NODE_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%"
      SET "NODE_EXE_DOWNLOAD_CACHE_PATH=%NODE_DOWNLOAD_CACHE_PATH%binnode.exe"
      IF DEFINED DOWNLOAD_NODE (
      CALL :create_dir %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
      ECHO "Cache directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
      IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
      ECHO "Zip download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :download %NPM_REGISTRY%/node-win-%NODE_EXE_ARCH%/-/%NODE_PACKAGE_FILENAME% %NODE_PACKAGE_DOWNLOAD_PATH%
      IF NOT EXIST "%NODE_PACKAGE_DOWNLOAD_PATH%" (
      ECHO "Node.js download failed"
      EXIT %ERRORLEVEL%
      )

      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NODE_PACKAGE_DOWNLOAD_PATH% %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%packagebinnode.exe" (
      ECHO "Extracting Node,js package failed"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_dir %NODE_DOWNLOAD_CACHE_PATH%
      IF EXIST "%NODE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Failed to delete %NODE_DOWNLOAD_CACHE_PATH%"
      EXIT %ERRORLEVEL%
      )

      CALL :move %DOWNLOAD_CACHE_PATH%package %NODE_DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Renaming Node.js package directory failed"
      EXIT %ERRORLEVEL%
      )
      )

      IF NOT EXIST "%NODE_EXE_DOWNLOAD_CACHE_PATH%" (
      ECHO "Cached Node.js package directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_file %NODE_EXE%
      IF EXIST "%NODE_EXE%" (
      ECHO "Failed to delete %NODE_EXE%"
      EXIT %ERRORLEVEL%
      )

      CALL :copy_file %DOWNLOAD_CACHE_PATH%nodejs-%NODE_PACKAGE_VERSION%binnode.exe %NODE_EXE%
      IF NOT EXIST "%NODE_EXE%" (
      ECHO "Copying Node exe failed"
      EXIT %ERRORLEVEL%
      )
      )

      SET "NPM_PACKAGE_FILENAME=npm-%NPM_PACKAGE_VERSION%.tgz"
      SET "NPM_PACKAGE_DOWNLOAD_PATH=%DOWNLOAD_CACHE_PATH%%NPM_PACKAGE_FILENAME%"
      SET "NPM_CLI_JS_DOWNLOAD_CACHE_PATH=%DOWNLOAD_CACHE_PATH%npm-%NPM_PACKAGE_VERSION%binnpm-cli.js"
      IF DEFINED DOWNLOAD_NPM (
      CALL :create_dir %DOWNLOAD_CACHE_PATH%
      IF NOT EXIST "%DOWNLOAD_CACHE_PATH%" (
      ECHO "Cache directory missing"
      EXIT %ERRORLEVEL%
      )

      CALL :download %ZIP_DOWNLOAD_URL% %ZIP_EXE_DOWNLOAD%
      IF NOT EXIST "%ZIP_EXE_DOWNLOAD%" (
      ECHO "Zip download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :download %NPM_REGISTRY%/npm/-/%NPM_PACKAGE_FILENAME% %NPM_PACKAGE_DOWNLOAD_PATH%
      IF NOT EXIST "%NPM_PACKAGE_DOWNLOAD_PATH%" (
      ECHO "npm download failed"
      EXIT %ERRORLEVEL%
      )

      CALL :extract_archive %ZIP_EXE_DOWNLOAD% %NPM_PACKAGE_DOWNLOAD_PATH% %NPM_PACKAGE_PATH%..
      IF NOT EXIST "%NODE_MODULES_PATH%packagebinnpm-cli.js" (
      ECHO "Extracting npm package failed"
      EXIT %ERRORLEVEL%
      )

      CALL :delete_dir %NPM_PACKAGE_PATH%
      IF EXIST "%NPM_PACKAGE_PATH%" (
      ECHO "Failed to delete %NPM_PACKAGE_PATH%"
      EXIT %ERRORLEVEL%
      )

      CALL :move %NPM_PACKAGE_PATH%..package %NPM_PACKAGE_PATH%
      IF NOT EXIST "%NPM_PACKAGE_PATH%" (
      ECHO "Renaming npm package directory failed"
      EXIT %ERRORLEVEL%
      )
      )

      EXIT /B %ERRORLEVEL%

      :clean_dir
      IF EXIST "%~1" (
      ECHO "Cleaning directory %~1"
      CALL CMD /C "MKDIR %temp%.empty 2>NUL"
      CALL CMD /C "ROBOCOPY %temp%.empty %~1 /MIR >NUL"
      )
      EXIT /B 0

      :delete_file
      IF EXIST "%~1" (
      CALL ECHO "Deleting file %~1"
      CALL DEL "%~1"
      )
      EXIT /B 0

      :delete_dir
      IF EXIST "%~1" (
      ECHO "Deleting directory %~1"
      CALL :clean_dir "%~1" >NUL
      CALL RMDIR "%~1"
      )
      EXIT /B 0

      :create_dir
      IF NOT EXIST "%~1" (
      ECHO "Creating directory %~1"
      CALL MKDIR "%~1"
      )
      EXIT /B 0

      :move
      IF NOT EXIST "%~2" (
      ECHO "Moving %~1 to %2"
      CALL MOVE "%~1" "%~2"
      )
      EXIT /B 0

      :copy_file
      IF NOT EXIST "%~2" (
      ECHO "Copying %~1 to %~2"
      CALL COPY "%~1" "%~2"
      )
      EXIT /B 0

      :copy_dir
      IF NOT EXIST "%~2" (
      ECHO "Copying %~1 to %2"
      CALL robocopy "%~1" "%~2" /E >NUL
      )
      EXIT /B 0

      :download
      IF NOT EXIST "%~2" (
      ECHO "Downloading %~1 to %~2"
      CALL bitsadmin.exe /transfer "Download" %~1 "%~2"
      )
      EXIT /B 0

      REM %~1 = %ZIP_EXE_DOWNLOAD%
      REM %~2 = %NODE_PACKAGE_DOWNLOAD_PATH%
      REM %~3 = %DOWNLOAD_CACHE_PATH%
      :extract_archive
      ECHO "Extracting %~2 to %~3"
      CALL CMD /C "%~1 x %~2 -so | %~1 x -aoa -si -ttar -o"%~3""
      EXIT /B 0






      beginner node.js http installer batch






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 8 hours ago









      200_success

      130k16153417




      130k16153417










      asked 10 hours ago









      Bonner 웃Bonner 웃

      19619




      19619






















          0






          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214576%2fbatch-script-to-download-and-extract-node-js-and-npm-packages%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214576%2fbatch-script-to-download-and-extract-node-js-and-npm-packages%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Fairchild Swearingen Metro Inhaltsverzeichnis Geschichte | Innenausstattung | Nutzung | Zwischenfälle...

          Pilgersdorf Inhaltsverzeichnis Geografie | Geschichte | Bevölkerungsentwicklung | Politik | Kultur...

          Marineschifffahrtleitung Inhaltsverzeichnis Geschichte | Heutige Organisation der NATO | Nationale und...