如何在Powershell脚本中编写此代码?

时间:2011-11-27 17:26:24

标签: powershell

我是Powershell脚本的新手。

我正在尝试从cmd

运行powershell脚本
powershell.exe Set-ExecutionPolicy Unrestricted
powershell.exe .\startup.ps1

我需要在PowerShell脚本中使用两行。

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"

%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

我可以在ps1文件中简单地这样写吗?

& %WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"

非常感谢

2 个答案:

答案 0 :(得分:12)

简短回答,包括一个问题:为什么这需要成为PowerShell脚本呢?

您只需创建一个包含

的批处理文件即可
%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"
%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

直接运行它,而不是试图找出执行策略等。

此外,appcmd 可能可能在您的PATH中,因此您可以直接运行它,而无需指定程序的完整路径。


更长的答案,实际上是使用PowerShell:这里有两个问题。

  1. 您希望在没有设置相应执行策略的情况下运行PowerShell脚本。这可以通过

    完成
    powershell -ExecutionPolicy Unrestricted -File myscript.ps1
    
  2. 您需要调整PowerShell脚本中的环境变量用法,因为%不用于在那里扩展环境变量。所以你真的需要

    & $Env:WinDir\system32\inetsrv\appcmd.exe add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated
    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ /applicationPool:VCPool
    

    另请注意,在每行之前需要一个和号(&)作为变量名称,在行的开头切换到表达式模式,同时要运行命令,因此需要命令模式

    此外,引用的参数在PowerShell中可能有点痛苦。 PowerShell在必要时尝试引用参数,并且当事情出错时,并不总是显而易见的。在这种情况下,最简单的方法是不以任何方式引用参数,以确保它们正确地出现:

    PS Home:\> args add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated
    argv[1] = add
    argv[2] = apppool
    argv[3] = /name:VCPool
    argv[4] = /managedRuntimeVersion:v4.0
    argv[5] = /managedPipelineMode:Integrated
    
    PS Home:\> args set app WebRole_IN_0_VC/ /applicationPool:VCPool
    argv[1] = set
    argv[2] = app
    argv[3] = WebRole_IN_0_VC/
    argv[4] = /applicationPool:VCPool
    

    然而,如果appcmd实际需要冒号后参数周围的引号,那么你需要用 single <引用整个参数/ em>引用并添加双引号:

    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ '/applicationPool:"VCPool"'
    

答案 1 :(得分:0)

您可能想知道可以将两个启动语句合并到CMD文件中的单个调用中:

powershell.exe -noprofile -executionpolicy unrestricted -file .\startup.ps1

从PowerShell调用appcmd.exe唯一有点奇怪的事情是你必须用引号括起参数,即使它不包含空格。你已经完成了这个,所以是的它应该可行。