0

我目前有这个批处理文件,允许我在 IIS 中创建应用程序和应用程序池。它可以工作,但它只创建一个应用程序和应用程序池。

这是我当前的脚本:

@echo ON
setlocal enabledelayedexpansion

REM "Content Source path" 
set arg1=%1

REM "Content destination path" 
set arg2=%2

REM "apps to setup" 
set arg3=%3

REM Split virt names and loop through it.
FOR /F "tokens=1* delims=," %%a in (%arg3%) do (

    set vir=%%a
    set pool=!vir!!poolname!

    REM CREATE APPLICATION  
    %systemroot%\system32\inetsrv\APPCMD add app /site.name:"Default Web Site" /path:/!vir! /physicalpath:"%arg2%"

    REM CREATE APP POOL
    %systemroot%\system32\inetsrv\appcmd add apppool /name:!pool! /managedPipelineMode:Integrated /processModel.identityType:ApplicationPoolIdentity /enable32BitAppOnWin64:false

    REM ASSIGN APP POOL TO APPLICATION
    %systemroot%\system32\inetsrv\appcmd set app /app.name:"Default Web Site/!vir!" /applicationPool:!pool!

):END Endlocal

install.bat "c:\source" "c:\target" "APP1,APP2,APP3"

请有人告诉我我做错了什么。

谢谢。

4

2 回答 2

2

问题 1::END ENDLOCAL不应该跟在“for %%a”循环中的右括号之后。这会产生语法错误。

问题2:如果:END ENDLOCAL移到下一行,endlocal则无效。与 Assembler 不同,Batch 不执行出现在标签后的“指令”。

问题3::END标签是多余的。它不在批次中使用。

问题 4:这endlocal是多余的 - 到达文件末尾会关闭在相同上下文中运行的任何本地环境。

问题 5:使用%n(n numeric) 分配变量将在分配的值中包含引号。用于%~n处理封闭引号。

问题 6:FOR/F针对文件。而它会解析一个带引号的字符串,就好像它是一条echo %string%指令,那只是一行,因此您的代码将只处理一次(遇到的“行”数),将第一个,- 分隔的标记分配%%a%%b(不曾用过)

在这种情况下,您需要的要简单得多-

FOR %%a in (%arg3%) do (

poolname问题7:此代码中未建立变量。除非在代码执行之前赋值,否则set pool=!vir!!poolname!将设置pool!vir!which 本身等价于%%a. 鉴于您显示的参数,以及我标记的更改,然后在您的代码中,!pool!==!vir!==%%a

于 2013-07-18T01:38:45.410 回答
2

尝试调用您的批次:

install.bat "c:\source" "c:\target" APP1,APP2,APP3

周围没有双引号APP..
args在批处理中设置:

set "arg3=%3,%4,%5"
于 2013-07-17T18:47:08.667 回答