我正在尝试编写一个简单的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.json
和src
)中找到名为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%"
)
如何设置为空字符串。)
答案 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-d
从dir
输出中删除所有目录名(以防万一目录名与提供的掩码匹配 - 尽管可能性很小)
如果你想在%%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