【问题标题】:PowerShell version differences with variablesPowerShell 版本与变量的差异
【发布时间】:2014-08-11 20:24:58
【问题描述】:

我在具有 PowerShell V2 的 Windows Server 2008 中运行脚本,该脚本从 IIS 收集 AppPool 名称,然后删除所有这些名称,然后删除所有网站和这些网站的内容。没有任何问题。工作精美。现在,在具有相同池和网站的 PowerShell V4 的 Windows Server 2012 上运行相同的脚本,并且不会因为 AppPools 名称中的空格而删除所有内容。为什么这只是 PS V4 中的一个问题。

这就是它的样子

在 v4 中,我是否双引号 $site 变量也没关系,因为它仍然会引发相同的错误。同样,这在 v2 中很好,并且运行速度更快。 2008 年服务器上完全相同的池、站点、内容可以在大约 20 秒内被删除,而在 2012 年则需要几分钟,然后抛出这样的错误并跳过一些内容。

....
$msdeploy=Get-Command 'C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe'

foreach ($site in $list.WebAppName) {
    write-host $site
    & $msdeploy -verb:delete -dest:appPoolConfig=$site –skip:objectname=rootwebconfig32 –skip:objectname=httpCert –skip:objectname=machineconfig32 
}

输出就是这个例子

2.0 DefaultAppPool

msdeploy.exe : Error: Unrecognized argument '"-dest:"appPoolConfig=2.0'. All arguments must begin with "-".
At line:19 char:5
+     & $msdeploy -verb:delete -dest:appPoolConfig=$site –skip:objectname=rootwe ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (Error: Unrecogn...begin with "-".:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Error count: 1.

【问题讨论】:

    标签: variables powershell msdeploy


    【解决方案1】:

    你做错了。来自Web Deploy Command Line Syntax 的 MSDN 文档摘录

    通过对其常用语法稍作修改,Web Deploy 命令可以 从 Windows PowerShell 提示符运行。为此,请更改冒号 Web 的动词、源和目标参数之后的字符 (:) 将命令部署到等号 (=)。在以下示例中,比较 Web Deploy 命令及其 PowerShell 版本。

    Web 部署命令:msdeploy -verb:sync -source:metakey=/lm/w3svc/1 -dest:metakey=/lm/w3svc/2 -verbose

    PowerShell 命令:.\msdeploy.exe -verb=sync -source=metakey=/lm/w3svc/1 -dest=metakey=/lm/w3svc/2 -verbose

    你的命令语法应该是

    $msdeploy -verb=delete -dest=appPoolConfig=$site.trim() –skip=objectname=rootwebconfig32
    –skip=objectname=httpCert –skip=objectname=machineconfig32
    

    【讨论】:

    • 这也不起作用。它显示msdeploy.exe : Error Code: ERROR_OBJECT_TO_BE_DELETED_DOES_NOT_EXIST At line:19 char:5 + & $msdeploy -verb=delete -dest=appPoolConfig=$site 然后当你修复它时它显示msdeploy.exe : Error: Unrecognized argument '"-dest=appPoolConfig= mysite"'
    • 仔细查看错误,您会发现,这完全是另一回事。这次您收到错误,因为您尝试删除的特定对象/站点不存在,而不是原始发布的错误。
    • 看起来您的$site 包含空格,因此您遇到了错误。尝试修剪像$site.replace(' ','') 这样的空间。用那个编辑的答案。
    • 将与之比较的应用程序池名称本身包含空格,因此如果将变量中的空格修剪掉,它仍然会失败。我的意思是它在 2008 powershell v2 中工作,在 2012 powershell v4 中失败。而且它的速度要慢得多。微软对此做了什么?
    • 另外,-dest=appPoolConfig=$site.replace(' ','') 也不起作用。 $site 必须用双引号引起来,否则它无法将其识别为变量并且无法识别 .replace()
    【解决方案2】:

    我会尝试将您的参数值封装在引号中,并将语句封装在大括号中,如下所示:

    & { $msdeploy -verb=delete -dest=appPoolConfig="$site" –skip=objectname=rootwebconfig32 –skip=objectname=httpCert –skip=objectname=machineconfig32 }
    

    【讨论】:

    • 上面写着At line:19 char:18 + & {$msdeploy -verb=delete -dest=appPoolConfig="$site" –skip=objectname=rootw ... + ~~~~~ Unexpected token '-verb' in expression or statement. At line:19 char:8 + & {$msdeploy -verb=delete -dest=appPoolConfig="$site" –skip=objectname=rootw ... + ~~~~~~~~~~~~~~~ The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多