Set-Content:找不到接受参数的位置参数

Set-Content : A positional parameter cannot be found that accepts argument

我正在尝试使用 Set-Content 创建一个 xml 文档,其中传递了一个变量。我可以从我自己的桌面 (windows 10) 运行 毫无问题地执行以下命令。但是 运行在服务器 (Windows Server 2016) 上安装它时出现错误。

Set-Location "C:\MID Server\prodAgent\agent"
$MyVariable = '123456'
Set-Content C:\MID Server\prodAgent\agent\config.xml "<?xml version='1.0' encoding='UTF-8'?>
<parameters>
    <parameter name='url' value='https://dev.service.com/'/>
    <parameter name='mid.instance.username' value='Server'/>
    <parameter secure='true' name='mid.instance.password' value='$MyVariable'/>
    <parameter name='name' value='Test'/>
    <parameter name='mid_sys_id' value=''/>
</parameters>"`
Set-Content : A positional parameter cannot be found that accepts argument '<?xml version='1.0' encoding='UTF-8'?>
<parameters>
    <parameter name='url' value='https://dev.service-now.com/'/>
    <parameter name='mid.instance.username' value='Server'/>
    <parameter secure='true' name='mid.instance.password' value='123456'/>
    <parameter name='name' value='Test'/>
    <parameter name='mid_sys_id' value=''/>
</parameters>'.
At line:16 char:1
+ Set-Content C:\MID Server\prodAgent\agent\config.xml "<?xml version=' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Content], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetContentCommand

在这两种情况下,我都运行以管理员身份执行命令。

感谢您的帮助

在 PowerShell 5.1 上,除了代码中的最后一个反引号和未加引号的路径(此路径包含 space 字符外),我无法重现该错误。

既然要写XML,为什么不用xml.Save()的方法呢?

$MyVariable = '123456'
[xml]$xml =  @"
<?xml version='1.0' encoding='UTF-8'?>
<parameters>
    <parameter name='url' value='https://dev.service.com/'/>
    <parameter name='mid.instance.username' value='Server'/>
    <parameter secure='true' name='mid.instance.password' value='$MyVariable'/>
    <parameter name='name' value='Test'/>
    <parameter name='mid_sys_id' value=''/>
</parameters>
"@

$xml.Save('C:\MID Server\prodAgent\agent\config.xml')

如果您必须使用 Set-Content 执行此操作,我建议您使用 Here-String:

$MyVariable = '123456'
Set-Content -Path 'C:\MID Server\prodAgent\agent\config.xml' -Value @"
<?xml version='1.0' encoding='UTF-8'?>
<parameters>
    <parameter name='url' value='https://dev.service.com/'/>
    <parameter name='mid.instance.username' value='Server'/>
    <parameter secure='true' name='mid.instance.password' value='$MyVariable'/>
    <parameter name='name' value='Test'/>
    <parameter name='mid_sys_id' value=''/>
</parameters>
"@ -Encoding UTF8

显示了可行的解决方案,但要解决 根本原因

由于目标路径 C:\MID Server\prodAgent\agent\config.xml 包含一个 space 字符,您必须 quote 以便 Set-Content 将其识别为 单个 参数。

因此,

# !! BROKEN - quoting of the path is missing.
Set-Content C:\MID Server\prodAgent\agent\config.xml "<?xml ..."

必须是(注意路径的single-quoting):

Set-Content 'C:\MID Server\prodAgent\agent\config.xml' "<?xml ..."

Set-Content C:\MID Server\prodAgent\agent\config.xml "<?xml ..." 实际上与
相同 Set-Content 'C:\MID' 'Server\prodAgent\agent\config.xml' "<?xml ...",即传递3个参数,而Set-Content只支持2个位置参数(-Path-Value)。因此,PowerShell 抱怨 "<?xml ..." 作为意外的第三个参数。

另见:about_Quoting_Rules.