我是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"
非常感谢
答案 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:这里有两个问题。
您希望在没有设置相应执行策略的情况下运行PowerShell脚本。这可以通过
完成powershell -ExecutionPolicy Unrestricted -File myscript.ps1
您需要调整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唯一有点奇怪的事情是你必须用引号括起参数,即使它不包含空格。你已经完成了这个,所以是的它应该可行。