【问题标题】:how do i make program that modify value percent in file MIK_Neva.xml我如何制作修改文件 MIK_Neva.xml 中值百分比的程序
【发布时间】:2019-11-22 08:55:35
【问题描述】:

如何重新制作此程序以从 power shell 提示符输入百分比值? 如何修改此代码以从 powershell 提示符输入百分比值

$inputpercent = Read-Host -Prompt 'percent:'
$outputFile = 'MIK_Neva.xml'
$utf8WithoutBom = New-Object System.Text.UTF8Encoding($false)
$sw = New-Object System.IO.StreamWriter($outputFile, $false, $utf8WithoutBom)
[xml](Get-Content "$outputFile") | ForEach-Object {$_.SelectNodes('//FieldCostOptions/IncreaseCost') | ForEach-Object {$_.SetAttribute("Percent", $inputpercent)};#  $_.Save('Output.xml')}


$xml.Save( $sw )
$sw.Close()
}

得到一个错误

PS C: \ program> $ inputpercent = Read-Host -Prompt 'percent:'
$ outputFile = 'MIK_Neva.xml'
$ utf8WithoutBom = New-Object System.Text.UTF8Encoding ($ false)
$ sw = New-Object System.IO.StreamWriter ($ outputFile, $ false, $ utf8WithoutBom)
[xml] (Get-Content "$ outputFile") | ForEach-Object {$ _. SelectNodes ('// FieldCostOptions / IncreaseCost') | ForEach-Object {$ _. SetAttribute ("Percent", $ inputpercent)}; # $ _. Save ('Output.xml')}


$ xml.Save ($ sw)
$ sw.Close ()
}
percent :: 8
Cannot call a method for an expression with a NULL value.
line: 5 character: 52
+ ... ach-Object {$ _. SelectNodes ('// FieldCostOptions / IncreaseCost') | ForE ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~
     + CategoryInfo: InvalidOperation: (:) [], RuntimeException
     + FullyQualifiedErrorId: InvokeMethodOnNull

文件 MIK_Neva.xml

 <?xml version="1.0" encoding="utf-8"?>
<PriceConfiguration Name="MIK_Neva" Version="1"><Description></Description><AuthorID>s0011373519</AuthorID><LastEditedBy>s0011373519</LastEditedBy><LastUpdate>14.11.2019 12:56:45</LastUpdate><File Type="XLS" Engine="0"><FilesMask>E:\FTP\PRICE_FORCEAUTO_MIK\NevaAvtocom.xlsx</FilesMask><IncludeFiles></IncludeFiles><ExcludeFiles></ExcludeFiles><Macro OnStart=""/><XLSoptions><Password></Password><MergeXLSsheets>1</MergeXLSsheets></XLSoptions><CSVoptions><RowsSeparator>13-10</RowsSeparator><ColumnsSeparator>59</ColumnsSeparator><AddHeaderRow>0</AddHeaderRow><UseBrackets>0</UseBrackets><Encoding>windows-1251</Encoding></CSVoptions><ReplaceTable Name="Price Codes" IsEmpty="False"><Replacement Find="{@КодПрайса}" ReplaceWith=""/><Replacement Find="{@ИмяФайлаДляПрайса}" ReplaceWith=""/></ReplaceTable></File><Sheets><SheetConfiguration index="1"><Name>Обработчик листа</Name><Description></Description><SheetSelectMode>1</SheetSelectMode><SheetName>остатки Микадо</SheetName><SheetIndex>1</SheetIndex><ReplaceTable Name="Price Sheet Codes" IsEmpty="False"><Replacement Find="{@КодЛиста}" ReplaceWith=""/><Replacement Find="{@ИмяФайлаДляЛиста}" ReplaceWith=""/></ReplaceTable><PriceFields><Field index="1" Enable="1"><Name>Артикул</Name><SheetColumn>1</SheetColumn><UseCellText>1</UseCellText><Required>1</Required><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/><ReplaceTableName>Артикул (EMEX_Neva)</ReplaceTableName></Field><Field index="2" Enable="1"><Name>Наименование</Name><SheetColumn>2</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/><ReplaceTableName>Наименование (FA)</ReplaceTableName></Field><Field index="3" Enable="1"><Name>Производитель</Name><SheetColumn>5</SheetColumn><Required>1</Required><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="4" Enable="1"><Name>Наличие</Name><SheetColumn>3</SheetColumn><Required>1</Required><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="5" Enable="1"><Name>Цена</Name><SheetColumn>4</SheetColumn><Required>1</Required><ValueMode>0</ValueMode><KeepValue>1</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="1" Version="1"><Function CodeName="CompareNumbers" Enabled="1" param1="3000" param2="1000000"/></FieldFunctions><FieldConditions Enable="1" Version="1"/><FieldCostOptions Enabled="1" Version="1"><IncreaseCost Enabled="1" Percent="-5"/></FieldCostOptions></Field><Field index="6" Enable="1"><Name>ЦенаЗакупа</Name><SheetColumn>4</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="7" Enable="1"><Name>ПР</Name><SheetColumn>1</SheetColumn><ValueMode>1</ValueMode><Formula>NevaAvtocom</Formula><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="8"><Name>Срок_ZZAP</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="9"><Name>КодСтраны</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="10"><Name>Страна</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="11"><Name>ГТД</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="12"><Name>ИНН_Поставщика</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="13"><Name>КПП_Поставщика</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="14"><Name>НомерН</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="15"><Name>ДатаН</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="16"><Name>НомерСчета</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="17"><Name>ДатаСчета</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="18"><Name>НамерСФ</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field><Field index="19"><Name>ДатаСФ</Name><SheetColumn>1</SheetColumn><ValueMode>0</ValueMode><KeepValue>0</KeepValue><KeepLevel>0</KeepLevel><FieldFunctions Enabled="0" Version="1"/><FieldConditions Enable="0" Version="1"/></Field></PriceFields><FirstRow>2</FirstRow><LastRowColumn>1</LastRowColumn></SheetConfiguration></Sheets></PriceConfiguration>

【问题讨论】:

  • 省略'// FieldCostOptions / IncreaseCost'中多余的空格字符

标签: powershell


【解决方案1】:

在您的代码中,使用“.Percent” - 从 SelectSingleNode 返回的对象不会被解析为具有字段 Percent 的某个类。只有 XmlNodes 具有工作属性的方法 你应该使用

x.SelectSingleNode ('// FieldCostOptions / IncreaseCost').SetAttribute("Percent", -5)

拜托,或者你可以用这个例子在一行中执行:

[xml](Get-Content "input.xml") | ForEach-Object {$_.SelectNodes('// FieldCostOptions/IncreaseCost') | ForEach-Object {$_.SetAttribute("Percent", -5)}; $_.Save('Output.xml')}

如果你想写一个脚本,那是你想要的吗?

$inputFile = Read-Host -Prompt 'Input file name to process'
$outputFile = Read-Host -Prompt 'Output file name'
$xml = New-Object -TypeName XML
$xml.Load($inputFile)

$utf8WithoutBom = New-Object System.Text.UTF8Encoding($false)
$sw = New-Object System.IO.StreamWriter($outputFile, $false, $utf8WithoutBom)

$xml.Save( $sw )
$sw.Close()

【讨论】:

  • 嗯...你用象形文字来举例。而且我不知道它应该是什么。请更改您的问题(附上正确的文字),我会尽力帮助您。至于第二个问题,它不是程序,它只是命令。如果要在 .ps1 文件中编写特定脚本,则应将其拆分为不同的行。 | - 是管道运算符,将前一个操作的结果发送到下一个。您可以将其拆分为变量并用 foreach 替换 ForEach-Object。或者您可以替换代码中的一行。正如我在第一个例子中解释的那样
  • 你能在 Telegram @tematre 中给我写信吗?我来自俄罗斯
  • 你想做什么?如果您想从当前值中添加或减去?当前代码只是替换旧值。
  • 1 如何使用对俄语 utf8 或 win1151 的支持
  • 我更改了代码,最后一个示例是使用文件并正确使用俄语。请写我有很多英文要写的文字=)
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多