在博客园代震军BLOG 上,他翻译了:使用IIS 7.0 PowerShell 创建web站点,Web应用,虚拟路径和应用程序池,因为可能会在以后使用windows服务器,所以相对比较关心一下,也就复制了一份做为资料。
原文网址:http://www.cnblogs.com/daizhj/archive/2008/12/22/1352019.html
作者:代震军(我看原文最后还有个人信息,也一并转载,省得说我复制部份,呵呵)
原文如下:
原文链接:Creating Web-Sites, Web Applications, Virtual Directories and Application Pools
在本文中您将学会如何去创建WEB站点,Web Applications, 虚拟目录和应用程序池.
介绍
IIS PowerShell 名空间包括诸如: Web-Sites, Apps, Virtual Directories 和 Application Pools.
使用内置的PowerShell cmdlets可以很容易创建一个名空间项和管理该项.
创建Web站点
如果您熟悉PowerShell 的话,就会知道在各种PowerShell 名空间下New-Item cmdlet 通常被用于创建
新项。 举个例子,当前命令 "New-Item c:\TestDirectory" 会创建一个新的文件夹 (尽管多数人使用New-Item
的别名命令 "MD" 或 "MKDIR" ). 在IIS 7.0 PowerShell 名空间下,New-Item 也常用于创建新的Web站点.
参数
在创建一个文件系统路径时,您需要指定一个路径名称. 不巧的是当前创建WEB站点时这是不够的. 除了像
文件系统路径这样的参数之外,还需要network bindings. 下面的命令用于创建一个新的WEB站点并使用dir命令
进行显示:
PS IIS:\Sites> New-Item iis:\Sites\TestSite -bindings @{protocol="http";bindingInformation=":80:TestSite"} -physicalPath c:\test
PS IIS:\Sites> dir
Name ID State Physical Path Bindings
---- -- ----- ------------- --------
Default Web Site 1 Started f:\inetpub\wwwroot http *:80:
TestSite 2 Started c:\test http :80:TestSite
这里直接使用了 -physicalPath 参数. 然而您可能会问: -bindings 看起来咋这么复杂?.
在构造时通常使用hashtable (在 这里 了解更多PowerShell hash tables信息). hash table 中的键值对表示一个
设置集合,该集合在IIS站点bindings section中会反射出相关属性:
<bindings>
<binding protocol="http" bindingInformation=":80:TestSite" />
</bindings>
现在我们找出了一个使用hash table的原因: IIS 配置是可以使用属性进行扩展的。 (查看 这里 了解更多信息) . 您
可以想像一下使用其它属性扩展 <binding> 元素节点. hash table 的键值对提供了这种弹性.
坦白说,该语法有一点复杂. 我们正在考虑在Tech Preview中封装一些典型任务:比如创建站点的方法或脚本。
删除站点
下面是删除刚创建的站点.
PS IIS:\ >Remove-Item IIS:\Sites\TestSite
创建Web Applications
创建Web Applications 要比创建站点要容易. 下面:
PS IIS:\> New-Item 'IIS:\Sites\Default Web Site\DemoApp' -physicalPath c:\test -type Application
Name ApplicationPool EnabledProtocols PhysicalPath
---- --------------- ---------------- ------------
DemoApp DefaultAppPool http c:\test
您仅需指定的一个参数是 type (-type) ,因为在一个站点下,您可能要创建一个Applications 或一个虚拟路径.
通过指定 -type 参数,就会告之 IIS Provider 要创建一个application.
要删除这个 application 的话,也可以使用Remove-Item(见上面删除站点).
创建虚拟目录
要创建虚拟目录,您也要使用New-Item cmdlet. 下面会在指定站点(Default Web Site)下创建两个虚拟目录。
一个位于站点下,一个位于刚创建的 Web Application (DemoApp)下面.
PS IIS:\> New-Item 'IIS:\Sites\Default Web Site\DemoVirtualDir1' -type VirtualDirectory -physicalPath c:\test\virtualDirectory1
Name PhysicalPath
---- ------------
DemoVirtualDir1 c:\test\virtualDirectory1
PS IIS:\> New-Item 'IIS:\Sites\Default Web Site\DemoApp\DemoVirtualDir2' -type VirtualDirectory -physicalPath c:\test\virtualDirectory2
Name PhysicalPath
---- ------------
DemoVirtualDir2 c:\test\virtualDirectory2
创建应用程序池
创建应用程序池更简单. 仅需指定一个名称即可.
PS IIS:\> new-item AppPools\DemoAppPool
Name State
---- -----
DemoAppPool {}
简单吧,不是吗? 现在让我们将这些知识点连起来做一个完整的方案.
将所有知识点连在一起
在这个方案中,我们将执行下面这些步骤:
-
创建一系列的文件系统路径用于绑定站点, web applications 和虚拟文件。
-
向新创建的目录下拷贝一些简单的web内容。
-
创建一个新的应用程序池。
-
创建一个新的站点,一个新的 application 以及两个虚拟目录并将其绑到新创建的应用程序池上。
-
使用浏览器请求(访问这些内容)。
步骤 1: 创建目录
我们使用 New-Item cmdlet 来创建新的文件系统目录. 执行下面命令 (如不想指定-type 参数的话,可使用'md'):
New-Item C:\DemoSite -type Directory
New-Item C:\DemoSite\DemoApp -type Directory
New-Item C:\DemoSite\DemoVirtualDir1 -type Directory
New-Item C:\DemoSite\DemoVirtualDir2 -type Directory
步骤 2: 拷贝内容
现在向这些目录中写入一些 html 内容(文件):
Set-Content C:\DemoSite\Default.htm "DemoSite Default Page"
Set-Content C:\DemoSite\DemoApp\Default.htm "DemoSite\DemoApp Default Page"
Set-Content C:\DemoSite\DemoVirtualDir1\Default.htm "DemoSite\DemoVirtualDir1 Default Page"
Set-Content C:\DemoSite\DemoVirtualDir2\Default.htm "DemoSite\DemoApp\DemoVirtualDir2 Default Page"
步骤 3: 创建新的应用程序池
为站点创建一个新的应用程序池 'DemoAppPool' (如之前的例子中您也创建的话,请先删除它).
New-Item IIS:\AppPools\DemoAppPool
Step 4: 创建新的站点, Web Applications 和虚拟目录并绑定到应用程序池上
这里简化一下,我们创建 DemoSite, DemoApp 和两个虚拟目录:
DemoVirtualDir1 绑定到DemoSite 下
DemoVirtualDir2 绑定到DemoApp 下
我们将DemoSite 和 DemoApp 绑定到之前创建的 DemoAppPool 上. 为了不与'Default Web Site' 冲突,
这里DemoSite 的端口设置为 8080:
New-Item IIS:\Sites\DemoSite -physicalPath C:\DemoSite -bindings @{protocol="http";bindingInformation=":8080:"}
Set-ItemProperty IIS:\Sites\DemoSite -name applicationPool -value DemoAppPool
New-Item IIS:\Sites\DemoSite\DemoApp -physicalPath C:\DemoSite\DemoApp -type Application
Set-ItemProperty IIS:\sites\DemoSite\DemoApp -name applicationPool -value DemoAppPool
New-Item IIS:\Sites\DemoSite\DemoVirtualDir1 -physicalPath C:\DemoSite\DemoVirtualDir1 -type VirtualDirectory
New-Item IIS:\Sites\DemoSite\DemoApp\DemoVirtualDir2 -physicalPath C:\DemoSite\DemoVirtualDir2 -type VirtualDirectory
好,下面就要请求这些web 内容了。
步骤 5: 请求Web 内容
当然,您可以打开浏览器并敲入地址 http://localhost:8080/ ,以及其它链接(上面已创建)。但本文是PowerShell
的walkthrough 所以我们使用 .NET WebClient classes 来实现这个请求:
$webclient = New-Object Net.WebClient
$webclient.DownloadString("http://localhost:8080/");
$webclient.DownloadString("http://localhost:8080/DemoApp");
$webclient.DownloadString("http://localhost:8080/DemoVirtualDir1");
$webclient.DownloadString("http://localhost:8080/DemoApp/DemoVirtualDir2");
If you feeling adventurous you can also use Internet Explorer object itself:
$ie = new-object -com InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate(http://localhost:8080/);
总结
本文中,您了解了如何使用PowerShell创建WEB站点, Web Applications, 虚拟目录和应用程序池.
除此之外,我们还使用 PowerShell 创建了一个功能(函数)化的完整方案.
译者注: PowerShell Provider for IIS 7.0 (x86) - CTP2下载连接,请点击这里:)
当然除了上面的方式来管理IIS站点之外,还可以使用Microsoft.Web.Administration(该dll位于"Windows\
System32\inetsrv目录下)。下面的PS脚本就是实现指量创建,删除等站点操作功能的:
function Setup-IIS
{
param([int]$NumSites)
for($i=0 ; $i -lt $NumSites ; $i++)
{
$Appfolder = "c:\inetpub\webroot\Site$i"
if (-not (test-path $Appfolder))
{
md $AppFolder -force | out-null
$defaultHTM = "$Appfolder\default.htm"
echo "This is site $i" | out-file $defaultHTM
}
}
}
function Cleanup-IIS
{
param([int]$NumSites)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")
$mgr = new-object Microsoft.Web.Administration.serverManager
for($i=0 ; $i -lt $NumSites ; $i++)
{
$AppPoolName= "AppPool_$i"
$SiteName = "WebSite_$i"
$Appfolder = "c:\inetpub\webroot\Site$i"
$mgr.Sites.Remove($mgr.Sites[$SiteName])
$mgr.ApplicationPools.Remove($mgr.ApplicationPools[$AppPoolName])
if (test-path $Appfolder)
{
rd $Appfolder -recurse
}
}
$mgr.CommitChanges()
}
function Makewebs-IIS
{
param([int]$NumSites)
$start = get-date
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration") | out-null
$mgr = new-object Microsoft.Web.Administration.serverManager
for($i=0 ; $i -lt $NumSites ; $i++)
{
$AppPoolName= "AppPool_$i"
$SiteName = "WebSite_$i"
$portNumber = 8000 + $i
$mgr.ApplicationPools.Add($AppPoolName) | out-null
$Appfolder = "c:\inetpub\webroot\Site$i"
$site = $mgr.Sites.Add($SiteName,$Appfolder,$portNumber)
$site.ServerAutoStart = $true
$app = $site.Applications[0]
$app.ApplicationPoolName = $AppPoolName
#$site.Bindings.Add("*:$portNumber:", "http") | out-null
}
$mgr.CommitChanges()
$duration = [DateTime]::Now - $start
write-host "Total seconds: " + $duration.TotalSeconds.Tostring()
}
我们只要以“管理员身份”运行Powershell,并在命令行下输入如下(以创建站点为例)代码:
>Makewebs-IIS 10
这样就会批量创建10web站点了:)
好了,今天的内容就先到这里了。
原文链接:http://www.cnblogs.com/daizhj/archive/2008/12/10/1352019.html
作者: daizhj, 代震军
Tags: iis7,powershell,powershell provider
网址: http://daizhj.cnblogs.com/
————EOF————
由于PowerShell将会成为未来CMD的替代品,对于它,有很多人都在关注着,也曾经下载了一个关于PowerShell的介绍和简单使用 的PDF,(在家里),等有空的时候也一并上传
说实话,我看到这个标题的时候没有看懂,确实没有理解本文的标题想表达什么意思。看完之后我是理解了。先贴上原文,再谈我的理解。。。
原文地址:http://www.cn-cuckoo.com/2008/12/24/shallow-or-deep-copy-and-pass-by-value-or-reference-270.html
内容如下:
XML/HTML代码
- 这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。
-
- 一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于不可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,堆内存和栈内存分别用于保存不可变类型值和可变类型值。
-
- 什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:
-
- var stringValue = “I’m immutable data structure, mean you can’t modify me!”;
- var anotherStringValue = stringValue;
- stringValue = “I have changed”;
-
- 此时,anotherStringValue中保存的值会不会也变成“I have changed”?不会。因为
-
- var anotherStringValue = stringValue;
-
- 照stringValue中保存的字符串的原样,复制一个字符串(相应地,在内存中分配一块新空间),并将该字符串赋给 anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即
-
- stringValue = “I have changed”;
-
- 只会影响stringValue的值。但是,确切来讲,stringValue = “I have changed”;并不是修改stringValue,而是创建了一个新字符串(相应地,在内存中分配一块新空间),然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了(当然,垃圾所占用的内存会被回收)。
-
- 由此可见,赋值操作对于不变类型而言,传递的是内存中的值本身。那么,对于可变类型呢?当然,传递的是内存中值的引用(或者说地址),而且无论传递多少次,内存中始终都只有一份原始值——毕竟可变类型大小莫测,只保存一份原始值能最大限度节省内存空间。例如:
-
- var objectValue = {1:1,’s’:’string’,'innerObject’:{’innerArray’ : [1,2,3]}};
- var anotherObjectValue = objectValue;
- objectValue[1] = 100;
- anotherObjectValue[1]; //100
-
- 不言自明,这里的anotherObjectValue通过赋值操作,从objectValue那里只获得了对原始对象( {1:1,’s’:’string’,'innerObject’:{’innerArray’ : [1,2,3]}})的引用,也就是该对象在内存中的地址,或者说“门牌号码”。因此,修改通过objectValue修改原始对象的第一个元素(objectValue[1] = 100;),结果当然会在anotherObjectValue[1]这里得到反映了。
-
- 在JavaScript中,给函数传递参数是按照上述默认约定——即对不可变类型,传值;对可变类型,传址——进行的。如:
-
- function example(str, obj){
- ……
- }
- example(stringValue,objectValue);
-
- 调用example函数时,第一个参数传递的是实际的字符串值,第二参数传递的是对象的引用(内存地址)。
-
- 在PHP中,定义函数时可以指定相应参数是传值还是传址——通常是传值。其实,这也很容易理解:假如函数要求为某个可变类型参数传值,而不是传址,那么也就意味着内存中会因此多出一份该类型值的副本。相应地,在函数中修改这份新副本,不会影响函数外的原副本。因为新旧副本在内存中就不是同一个地址。说到这,也就引出了浅复制和深复制的概念。事实上,浅复制和深复制的区别恰恰在于复制可变类型时,是传值还是传址。如果是像往常一样传址(传引用),那么就是浅复制。如果是传值,那么就是深复制。浅复制和深复制到底有什么区别呢?以下面的Python代码为例:
-
- >>> x = {’username’: ‘admin’, ‘machines’: [’foo’, ‘bar’, ‘baz’]}
- >>> y = x.copy()
- >>> y[’username’] = ‘mlh’
- >>> y[’machines’].remove(’bar’)
- >>> y
- {’username’: ‘mlh’, ‘machines’: [’foo’, ‘baz’]}
- >>> x
- {’username’: ‘admin’, ‘machines’: [’foo’, ‘baz’]}
-
- 调用字典x的copy方法返回一个新字典并赋值给y,新字典中带有与原字典相同的键-值对。注意,copy方法采用浅复制创建的新字典,与原字典有区别也有联系。区别体现在,对于原字典中不可变的值,如数字、字符串、元组等,会在新字典中重新生成一份新副本;因此,修改(实际上是替换,或者说是重新赋值)这些键的值(y[’username’] = ‘mlh’)不会影响原字典。联系体现在,对于原字典中可变的值,如列表、字典,不会在新字典中生成新副本,而只复制值的引用,即新字典中相应的键保存的是引用,当然,原字典中相应的键保存的也是引用,而且这两个引用都指向同一块内存地址。这就是所谓的浅复制。因此,如果修改的是可变类型的值(y[’machines’].remove(’bar’)),就一定会影响引用该值的原字典项了。
-
- 深复制则不然。深复制是实实在在地把原字典中所有的值全都照原样子重新创建一遍,无论是不变类型值,还是可变类型值。执行深复制后,内存中会存在两份完全一样的数据段,但分别处于不同内存空间中,即地址不同。而且,分别由不同变量(原字典、新字典)引用。因此,经过深复制后修改一个字典,不会影响另一个字典。Python的copy模块中的deepcopy函数可以实现深复制:
-
- >>> from copy import deepcopy
- >>> d = {}
- >>> d[’names’] = [’Alfred’, ‘Bertrand’]
- >>> c = d.copy()
- >>> dc = deepcopy(d)
- >>> d[’names’].append(’Clive’)
- >>> c
- {’names’: [’Alfred’, ‘Bertrand’, ‘Clive’]}
- >>> dc
- {’names’: [’Alfred’, ‘Bertrand’]}
-
- 显然,修改深复制得到的新值不会影响原值;而修改浅复制得到的“新”值,在某种程度上仍然会影响原值。
作者想表达的意思应该是在javascript中变量的复制和赋值,对于普通的变量而言,赋值仅仅是一个复制,而对于对象而言,赋值则是一个引用。
比如:var a=1;var b=a;
在这里,b其实是a的一个复制,所以b=1,正因为是复制,所以复制完后,b和a就没有任何关系了,当a重新赋值的时候,对于b则没有影响,同样,对于b再重新赋值,对a也没有影响 。
但是,如果a是一个对象,那就不一样了
例如var test ={a:1,b:2};var test1 =test;
在这样的情况下,test1就不再是test的复制了,而是直接取了test的地址,所以对于Test的值的改变,也影响到了test1,比如我test.a = 2,那么我test1.a的值也就自动变成了2
这点其实在PHP5里面已经也这样了,在PHP4的时候,对象的赋值也是一个复制,所以我们为了保证只有一个实例,往往都是采用:$a = &$b ;但是从5开始则不一样,对于对象而言,如果没有特别指定的操作,那么就相当于是对地址的一个引用。效果和上面的JS代码类似。
作者在最后举了一个PYTHON的例子来说明深复制,其实也就是为对象也做一个拷贝而不是采用引用,这个,当然在PHP里也有,clone就是实现的这个效果。HOHO