2017-07-26 242 views
0

我試圖將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文件。

我得到這個錯誤:

 
Error formatting a string: Input string was not in a correct format. 
At 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樣本:

 
UserName,SwitchIP,SwitchPort,MACAddress 
AHMETO,10.101.254.104,7,288023041d83 
ahmett,10.101.254.136,4,480fcf4a6719 

基本上我需要在XML文件中,以取代{} CSV文件中的變量,但我得到一個字符串格式錯誤。

編輯:好了,現在我已經發現了這個問題,也有與{}其他代碼,我讓他們雙,但現在我有一個新的錯誤:

to type "System.Xml.XmlDocument". Error: "'ahmett' is an unexpected token. Expecting white space. Line 5, position 84.

+0

'XMLTemplate_v2.ps1'的內容是什麼? '(&$ config)'執行該腳本,因此需要輸出一個用於'-f'的模板字符串來操作。 –

+0

我加了一塊它 – alhn34

回答

0

的一個您的模板中的ttribute值必須用引號引起來。更改此:

<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數據並拋出一個錯誤,以防其某些事情無效。

+0

謝謝兄弟,它現在工作的很好。 – alhn34

0

你應該做的格式一樣即:

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

如果你有適當的形式配置文件時,它會通過類似的東西;)

+0

現在我得到這個錯誤:無法將值「System.Object []」轉換爲鍵入「System.Xml.XmlDocument」。錯誤: 作爲此節點的有效子節點,因爲指定節點的類型是錯誤的。「 – alhn34

+0

顯然,您的配置文件格式不正確。 – KlapenHz

+0

這是問題,它不允許粘貼在我的公司,但我可以粘貼一塊: – alhn34