Powershell cmd批处理文件删除字符失败

Powershell cmd批处理文件删除字符失败,powershell,azure,batch-file,Powershell,Azure,Batch File,我正在尝试为azure web应用程序部署编写一个自定义deploy.cmd。我创建了一个test.cmd脚本来测试删除文件路径的第一个和最后一个字符: "D:\Program Files (x86)\npm\3.10.3\npm.cmd" 原因是,如果powershell脚本没有被引用,它会被打乱,但是cmd文件需要它没有被引用才能正确运行。我的测试脚本是: echo off setlocal enabledelayedexpansion SET DEPLOYMENT_SOURCE=D:\

我正在尝试为azure web应用程序部署编写一个自定义deploy.cmd。我创建了一个test.cmd脚本来测试删除文件路径的第一个和最后一个字符:

"D:\Program Files (x86)\npm\3.10.3\npm.cmd"
原因是,如果powershell脚本没有被引用,它会被打乱,但是cmd文件需要它没有被引用才能正确运行。我的测试脚本是:

echo off
setlocal enabledelayedexpansion

SET DEPLOYMENT_SOURCE=D:\home\site\wwwroot

SET NPM_CMD="D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%
set NPM_CMD=%NPM_CMD:~1, -1%
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
pushd "%DEPLOYMENT_SOURCE%"
这是有效的,并且正确地调用了npm。所以我采取了:

set NPM_CMD=%NPM_CMD:~1, -1%
行并将其放入我的主deploy.cmd文件中:

echo off
setlocal enabledelayedexpansion

:: Setup
:: -----        

echo starting deploy.cmd
echo -------------------
echo %*
SET all=%*
SET NPM_GLOBAL=%1
SET NPM_INFO=%2

echo all: %all%
echo NPM_GLOBAL: %NPM_GLOBAL%
echo NPM_INFO: %NPM_INFO%

SET DEPLOYMENT_SOURCE=D:\home\site\wwwroot

if NPM_GLOBAL=="True" (
    REM install specific version of NPM
    echo installing specific version of NPM @ %NPM_INFO%
    npm install -g npm@%NPM_INFO%
    %NPM_CMD%=npm
) else (    
    SET NPM_CMD=%NPM_INFO%
    set NPM_CMD=%NPM_CMD:~1, -1%
    echo %NPM_CMD%
    echo NPM_CMD set to %NPM_CMD%
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo Handling node.js deployment.
echo %DEPLOYMENT_SOURCE%
ECHO %DEPLOYMENT_SOURCE%\package.json

echo Install npm packages
IF EXIST "%DEPLOYMENT_SOURCE%\package.json" (
  pushd "%DEPLOYMENT_SOURCE%"
  echo Cleaning NPM cache.
  call "%NPM_CMD%" cache clean
  call "%NPM_CMD%" install
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)
这将产生以下输出:

PS D:\home\site\wwwroot> .\deploy.cmd False "D:\Program Files (x86)\npm\3.10.3\npm.cmd"

D:\home\site\wwwroot>echo off 
starting deploy.cmd
-------------------
False "D:\Program Files (x86)\npm\3.10.3\npm.cmd"
all: False "D:\Program Files (x86)\npm\3.10.3\npm.cmd"
NPM_GLOBAL: False
NPM_INFO: "D:\Program Files (x86)\npm\3.10.3\npm.cmd"
ECHO is off.
NPM_CMD set to 
'"~1, -1"' is not recognized as an internal or external command,
operable program or batch file.
Handling node.js deployment.
D:\home\site\wwwroot
D:\home\site\wwwroot\package.json
Install npm packages
Cleaning NPM cache.
PS D:\home\site\wwwroot> '"~1, -1"' is not recognized as an internal or external command,
operable program or batch file.
The system cannot find the batch label specified - error

我不明白为什么它不知道如何删除第一个和最后一个字符,为什么它会出错。我看不出该文件有任何其他错误。

若要删除引用字符串周围的引号,请在参数编号前插入一个波浪号(
~

%1 to %~1

将批处理文件的开头更改为此

echo starting deploy.cmd
echo -------------------
echo %*
SET all=%*
SET NPM_GLOBAL=%~1
SET NPM_INFO=%~2

要删除引用字符串周围的引号,请在参数编号前插入一个波浪号(
~

%1 to %~1

将批处理文件的开头更改为此

echo starting deploy.cmd
echo -------------------
echo %*
SET all=%*
SET NPM_GLOBAL=%~1
SET NPM_INFO=%~2
不要看后剥离周围的报价。相反,定义不带双引号的变量,如下所示:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)
然后,如有必要,使用双引号括起的符号,如下所示:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)
要将以上内容应用于主
deploy.cmd
文件,请读入
call/?

并在必要时使用:

echo starting deploy.cmd
echo -------------------
echo %*
SET all=%*
SET "NPM_GLOBAL=%1"       1st parameter is not in double quotes already
SET "NPM_INFO=%~2"        2nd parameter is stripped of surrounding double quotes
此外,您需要使用
应用延迟扩展!变数而不是
%variable%
,例如:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)
不要看后剥离周围的报价。相反,定义不带双引号的变量,如下所示:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)
然后,如有必要,使用双引号括起的符号,如下所示:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)
要将以上内容应用于主
deploy.cmd
文件,请读入
call/?

并在必要时使用:

echo starting deploy.cmd
echo -------------------
echo %*
SET all=%*
SET "NPM_GLOBAL=%1"       1st parameter is not in double quotes already
SET "NPM_INFO=%~2"        2nd parameter is stripped of surrounding double quotes
此外,您需要使用
应用延迟扩展!变数而不是
%variable%
,例如:

SET "DEPLOYMENT_SOURCE=D:\home\site\wwwroot"
SET "NPM_CMD=D:\Program Files (x86)\npm\3.10.3\npm.cmd"
echo %NPM_CMD%

pushd "%DEPLOYMENT_SOURCE%"
call "%NPM_CMD%" cache clean
call "%NPM_CMD%" install
(    
    SET "NPM_CMD=%NPM_INFO%"
    rem not necessary now set "NPM_CMD=!NPM_CMD:~1, -1!"
    echo !NPM_CMD!
    echo NPM_CMD set to !NPM_CMD!
)