【问题标题】:Error formatting a string: Input string was not in a correct format格式化字符串时出错:输入字符串的格式不正确
【发布时间】:2018-01-01 15:36:15
【问题描述】:

我正在尝试将 Excel 文件导入 PowerShell,然后将其另存为 XML 文件。我有一个 Excel 文件和一个 XML 模板。我所做的如下:

# define XML configuration template
$config = "C:\Users\mustafaal\Desktop\StajyerMustafaAl\Gorev\XMLTemplate_v2.ps1"
Import-Csv C:\Users\mustafaal\Desktop\StajyerMustafaAl\Gorev\VariablesDeneme.csv | ForEach-Object {
    $xml = "C:\Users\mustafaal\Desktop\StajyerMustafaAl\Gorev\MySampleConfig" + $_.UserName + ".xml"
    Write-Host $_.username
    Write-Host $xml
    [xml]$x = (&$config) -f $_.UserName, $_.SwitchIP, $_.SwitchPort, $_.MACAddress
    $x.Save($xml)
}

所以基本上我正在尝试为 Excel 文件中的每个用户名保存 XML 文件。

我收到此错误:

格式化字符串时出错:输入字符串的格式不正确。 在 C:\Users\mustafaal\Desktop\StajyerMustafaAl\Gorev\deneme1.ps1:14 char:1 + [xml]$x = (&$config) -f $_.UserName, $_.SwitchIP, $_.SwitchPort, $_.MACAddress

XML 模板示例:

<AttributeList>
    <RuleAttribute displayValue="Ethernet (15)" value="15" operator="EQUALS" name="NAS-Port-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue="Login-User (1), Framed-User (2), Authenticate-Only (8)" value="1,2,8" operator="BELONGS_TO" name="Service-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue={1} value={1} operator="EQUALS" name="NAS-IP-Address" type="Radius:IETF"/>
    <RuleAttribute displayValue={2} value={2} operator="EQUALS" name="NAS-Port-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue={3} value={3} operator="EQUALS_IGNORE_CASE" name="Calling-Station-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue="TEIDOM\"{0} value="TEIDOM\"{0} operator="EQUALS_IGNORE_CASE" name="User-Name" type="Radius:IETF"/>
</AttributeList>

CSV 样本:

用户名、交换机IP、交换机端口、MAC地址 AHMETO,10.101.254.104,7,288023041d83 艾哈迈特,10.101.254.136,4,480fcf4a6719

基本上,我需要将 XML 文件中的 {} 替换为 CSV 文件中的变量,但出现字符串格式错误。

编辑:好的,现在我找到了问题所在,还有其他带有{} 的代码,我把它们加倍了,但现在我得到了一个新错误:

键入“System.Xml.XmlDocument”。错误:“'ahmett' 是一个意外的标记。需要空格。第 5 行,第 84 位。

【问题讨论】:

  • XMLTemplate_v2.ps1的内容是什么? (&amp;$config) 执行该脚本,因此它需要输出一个模板字符串供 -f 操作。
  • 我加了一段

标签: xml excel powershell


【解决方案1】:

模板中的属性值必须用引号引起来。改变这个:

<AttributeList>
    <RuleAttribute displayValue="Ethernet (15)" value="15" operator="EQUALS" name="NAS-Port-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue="Login-User (1), Framed-User (2), Authenticate-Only (8)" value="1,2,8" operator="BELONGS_TO" name="Service-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue={1} value={1} operator="EQUALS" name="NAS-IP-Address" type="Radius:IETF"/>
    <RuleAttribute displayValue={2} value={2} operator="EQUALS" name="NAS-Port-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue={3} value={3} operator="EQUALS_IGNORE_CASE" name="Calling-Station-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue="TEIDOM\"{0} value="TEIDOM\"{0} operator="EQUALS_IGNORE_CASE" name="User-Name" type="Radius:IETF"/>
</AttributeList>

进入这个:

<AttributeList>
    <RuleAttribute displayValue="Ethernet (15)" value="15" operator="EQUALS" name="NAS-Port-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue="Login-User (1), Framed-User (2), Authenticate-Only (8)" value="1,2,8" operator="BELONGS_TO" name="Service-Type" type="Radius:IETF"/>
    <RuleAttribute displayValue="{1}" value="{1}" operator="EQUALS" name="NAS-IP-Address" type="Radius:IETF"/>
    <RuleAttribute displayValue="{2}" value="{2}" operator="EQUALS" name="NAS-Port-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue="{3}" value="{3}" operator="EQUALS_IGNORE_CASE" name="Calling-Station-Id" type="Radius:IETF"/>
    <RuleAttribute displayValue="TEIDOM\{0}" value="TEIDOM\{0}" operator="EQUALS_IGNORE_CASE" name="User-Name" type="Radius:IETF"/>
</AttributeList>

此外,您需要将模板加载为常规文本,因此您可以使用格式运算符 (-f) 填写值。完成后,您可以将数据另存为文本:

$template = Get-Content 'C:\path\to\template.xml' | Out-String
Import-Csv 'C:\path\to\input.csv' | ForEach-Object {
    $filename = 'C:\path\to\{0}.xml' -f $_.UserName
    $template -f $_.UserName, $_.SwitchIP, $_.SwitchPort, $_.MACAddress |
        Set-Content $filename
}

或将填充的模板解析为 XML 对象并保存:

$template = Get-Content 'C:\path\to\template.xml' | Out-String
Import-Csv 'C:\path\to\input.csv' | ForEach-Object {
    $filename = 'C:\path\to\{0}.xml' -f $_.UserName
    [xml]$xml = $template -f $_.UserName, $_.SwitchIP, $_.SwitchPort, $_.MACAddress
    $xml.Save($filename)
}

后者的优点是解析器将验证 XML 数据并在某些内容无效时抛出错误。

【讨论】:

    【解决方案2】:

    你应该这样做:

    $x = [xml](Get-Content $config)
    $x | Select-Object -Property UserName, SwitchIP, SwitchPort, MACAddress
    $x.Save($xml)
    

    如果你有正确格式的配置文件,它会是这样的;)

    【讨论】:

    • 现在我收到此错误:无法将值“System.Object[]”转换为类型“System.Xml.XmlDocument”。错误:作为该节点的有效子节点,因为指定的节点类型错误。"
    • 这是我公司不允许粘贴的问题,但我可以粘贴一部分:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-08-22
    相关资源
    最近更新 更多