为什么我在使用此CMD脚本时出现语法错误?

时间:2016-03-26 03:39:58

标签: windows batch-file cmd windows-10 command-prompt

我正在尝试编写一个简单的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

基本上,它的作用是尝试在几个选择目录(project.jsonsrc)中找到名为test的所有文件,并执行dnu restore,{{ 1}}和dnu build就可以了。

出于某种原因,我似乎在输入dnu pack循环的行上出现语法错误,说明for /f无法识别。 Here's当我删除%projectFile语句并重新运行脚本时,我终端的完整输出的要点。

任何人都可以告诉我为什么会这样,我能做些什么来解决它?感谢。

编辑:只需将其更改为:

@echo off

似乎仍然无法正常工作,尽管错误消息现在不同了。 Here's新输出的要点。 (注意for /f %%p in ('dir /b /s project.json') do ( set projectFile=%%p dnu restore "%projectFile%" dnu build "%projectFile%" dnu pack "%projectFile%" ) 如何设置为空字符串。)

2 个答案:

答案 0 :(得分: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将使用默认分隔符集分配第一个标记,其实际结果是截断第一个空间的名字。

for /?

来自docco的提示。

/a-ddir输出中删除所有目录名(以防万一目录名与提供的掩码匹配 - 尽管可能性很小)

如果你想在%%p中操纵名称而不是按原样使用它,你需要使用delayedexpansion或调用另一个例程来进行操作。执行前The basis of this characteristic is the delayedexpansion陷阱- batch will substitute the *parse-time* value of any%var%it finds in a code-block (parenthesised series of statements) for%var%,因为%projectFile%循环开始时for未定义,批次将被替换它与 nothing 在那时是它的价值。

有关文档,请参阅此处与delayedexpansion相关的许多文章或阅读

中的少量文档
set /?

答案 1 :(得分:0)

使用For构造,您可以在For构造中使用字母作为变量:a-z和A-Z(重要的是要注意字母区分大小写)。您可以通过多种方式使用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