2016-10-18 14 views
1

私たちのAzure Webアプリケーションデプロイメント用のカスタムdeploy.cmdを作成しようとしています。私は、ファイルパスの最初と最後の文字を削除しテストするためのtest.cmdのスクリプトを作成しました: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ファイルにそれを置く:だから私は取っ

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 

私は理由を理解していない:

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 [email protected]%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 
) 

これは次のような出力が得られます最初の文字と最後の文字を削除する方法とそれがなぜエラーであるのかはわかりません。私はファイルに間違ったことは何も見えません。

答えて

4

周囲の引用符を除去した後に見てはいけません。

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 

を代わりに、は、次のように二重引用符にを囲むせずに変数を定義しますdeploy.cmdファイル、call /?

… 
In addition, expansion of batch script argument references (%0, %1, 
etc.) have been changed as follows: 

    %* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 ...) 

    Substitution of batch parameters (%n) has been enhanced. You can 
    now use the following optional syntax: 

     %~1   - expands %1 removing any surrounding quotes (") 
     %~f1  - expands %1 to a fully qualified path name 
     %~d1  - expands %1 to a drive letter only 
     %~p1  - expands %1 to a path only 
Press any key to continue . . . 

し、必要なそれを適用します。

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!代わりの%variable%を使用して遅れ拡張を適用します。

( 
    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! 
) 
1

参照文字列の前後の引用符を削除するには、パラメータ番号の前にチルダ(~)を挿入します。これにあなたのバッチファイルの先頭を変更

%1 to %~1 

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