2016-03-26 10 views
1

私はレポのビルドを自動化するための簡単なCMDスクリプトを書こうとしています。ここでは、その全体がスクリプトです:基本的にこのCMDスクリプトで構文エラーが発生するのはなぜですか?

@echo off 
setlocal 

goto main 

:: Functions 

:buildSubdir 

pushd %1 
for /f %%projectFile in ('dir /b /s project.json') do (
    dnu restore "%%projectFile" 
    dnu build "%%projectFile" 
    dnu pack "%%projectFile" 
) 
popd 
goto :EOF 

:main 

:: Check for dnu 
where dnu > NUL 2>&1 
if %ERRORLEVEL% NEQ 0 (
    echo dnu wasn't found in your PATH! 1>&2 
    echo See http://docs.asp.net/en/latest/getting-started/installing-on-windows.html for instructions on installing the DNX toolchain on your PC. 1>&2 
    exit /b %ERRORLEVEL% 
) 

:: Do the actual work 
cd %~dp0 
call :buildSubdir src 
call :buildSubdir test 

は、どのようなことがないことは、いくつかの選択のディレクトリ(srctest)でproject.jsonという名前のすべてのファイルを検索してみてください、そして、dnu restorednu buildを実行しており、それらの上にdnu pack

何らかの理由で、私がfor /fループを入力したところで文法エラーが発生していると思われ、%projectFileが認識されていないと言っています。 Here's@echo offステートメントを削除してスクリプトを再実行すると、私の端末からの完全な出力の要点。

誰も私にこれがなぜ起こっているのか、私はそれを修正するために何ができるのか教えていただけますか?ありがとう。


編集:はちょうどこのにそれを変更:

for /f %%p in ('dir /b /s project.json') do (
    set projectFile=%%p 
    dnu restore "%projectFile%" 
    dnu build "%projectFile%" 
    dnu pack "%projectFile%" 
) 

それでもエラーメッセージが今異なっているが、動作していないようです。 Here's新しい出力の要点。 %projectFile%が空の文字列に設定されていることに注意してください。

+0

に乏しいドキュメントを読んで、変数は '%'で囲まれているので、 '%のprojectFileの%'になります。また、 'for'ループで参照しているので、' setlocal enabledelayedexpansion'を使う必要があります。 –

+0

@KenWhite 'for/f'ループにはありません... –

+0

' for'ループでは、 '!'で参照され、 '!projectFile!'となります。私は私のコメントを編集していた。 :-)遅延拡張を有効にする必要もあります。 –

答えて

1
for /f "delims=" %%p in ('dir /b /s /a-d project.json') do (
    dnu restore "%%p" 
    dnu build "%%p" 
    dnu pack "%%p" 
) 

ディレクトリ名は、それはあなたが使用しているすべてのだから、あなたはさらにそれを割り当てる必要がないので、%%pに割り当てられています。

delims=は行全体が%%pに割り当てられていることを確実にする - それ以外の場合、%%pは、デフォルトの区切り文字セットを使用して最初のトークンが割り当てられる、実用的な結果れた第1空間に名前を切り捨てることです。

はdoccoためのプロンプトから

for /? 

を参照してください。

/a-d

dir出力から任意のdirectorynamesを削除(念のためマスクが与え一致するディレクトリ名がある - それはかもしれませんが、小さな可能性)あなたは、むしろ %%pに名前を操作したいと思います場合

そのまま使用するよりも、delayedexpansionのいずれかを使用するか、操作を行うために別のルーチンを呼び出す必要がありました。The basis of this characteristic is the delayedexpansion trap - batch will substitute the *parse-time* value of any%var%it finds in a code-block (parenthesised series of statements) for%var%実行前に、%projectFile%がループの開始時に定義されていなかったので、バッチはではないの値をその時刻に置き換えます。バッチファイルでのドキュメントについては

、ここdelayedexpansionに関連する多くの、多くの記事を参照するか、

set /? 
+0

あなたは私の質問(といくつか)にあったすべてのポイントに対処しました。 'delims ='が引用されているかどうかは違いますか? –

+1

@JamesKo: "公式の構文"は、修飾子が引用されているということです - プロンプトから 'for /?'を見てください。クォークが悪用されるので、モディファイアを引用しないで*使用する必要はありません。 – Magoo

+0

説明のために、Magoo:D –

0

For構造では、a-zとA-Z(大文字と小文字が区別されることに注意してください)がFor構造にあります。 FORを使用する方法はいくつかありますが、ここから開始します。http://ss64.com/nt/for_f.html

また、必要に応じてヘルプを入手するには、FOR /?もあります。

私はあなたがこのために探していると思う:

@echo off 
setlocal 

goto main 

:: Functions 

:buildSubdir 

pushd %1 
for /f %%p in ('dir /b /s project.json') do (
    dnu restore "%%p" 
    dnu build "%%p" 
    dnu pack "%%p" 
) 
popd 
goto :EOF 

:main 

:: Check for dnu 
where dnu > NUL 2>&1 
if %ERRORLEVEL% NEQ 0 (
    echo dnu wasn't found in your PATH! 1>&2 
    echo See http://docs.asp.net/en/latest/getting-started/installing-on-windows.html for instructions on installing the DNX toolchain on your PC. 1>&2 
    exit /b %ERRORLEVEL% 
) 

:: Do the actual work 
cd %~dp0 
call :buildSubdir src 
call :buildSubdir test 
+0

より良い説明が必要...あなたはその質問に答える人です。 : –

+0

@JamesKo - 私は更新し、私の応答をきれいに整理したのでうまくいけば – Leptonator

関連する問題