Powershell cmd批处理文件删除字符失败
我正在尝试为azure web应用程序部署编写一个自定义deploy.cmd。我创建了一个test.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:\
"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!
)