gpt4 book ai didi

arrays - 如何从 Powershell 中的值数组创建文本文件

转载 作者:行者123 更新时间:2023-12-03 01:02:40 25 4
gpt4 key购买 nike

我有一个文本文件“list.txt”,其中包含我要解析的数百个 URL 的列表,以及一些通用配置数据,使用“list.txt”中的每个值将其解析为单个 xml 文件(配置文件) ",像这样:

list.txt 包含:

line_1
line_2
line_3

样板配置数据如下所示(以 line_1 为例):
<?xml version="1.0"?>
<Website xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Url>line_1.mydomain.com</Url>
<Title>line_1</Title>
<Enabled>true</Enabled>
<PluginInName>Tumblr</PluginInName>
</Website>

因此,如果“list.txt”包含 100 个项目,我想要使用 URL 编写的 100 个配置文件。和 Title元素个性化。

我摸索了几篇关于读取数组和创建文本文件的帖子,但我无法让它发挥作用。

我尝试过的,虽然它在这一点上已经过时了。我不确定我从哪里开始或如何到达这里:
$FileName = "C:\temp\list.txt"
$FileOriginal = Get-Content $FileName

# create an empty array
Foreach ($Line in $FileOriginal)
{
$FileModified += $Line

if ($Line -match $pattern)
{
# Add Lines after the selected pattern
$FileModified += 'add text'
$FileModified += 'add second line text'
}
}
Set-Content $fileName $FileModified

这是 方式超出了我的新手 Powershell 技能。任何人都可以帮忙吗?

最佳答案

您正在寻找 字符串模板方法 ,其中引用变量的字符串模板根据需要使用当时的变量值实例化:

# Define the XML file content as a *template* string literal
# with - unexpanded - references to variable ${line}
# (The {...}, though not strictly necessary here,
# clearly delineates the variable name.)
$template = @'
<code>
<?xml version="1.0"?>
<Website xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Url>${line}.mydomain.com</Url>
<Title>${line}</Title>
<Enabled>true</Enabled>
<PluginInName>Tumblr</PluginInName>
</Website>
'@


# Loop over all input lines.
Get-Content C:\temp\list.txt | ForEach-Object {
$line = $_ # store the line at hand in $line.
# Expand the template based on the current $line value.
$configFileContent = $ExecutionContext.InvokeCommand.ExpandString($template)
# Save the expanded template to an XML file.
$configFileContent | Set-Content -Encoding Utf8 "$line.xml"
}
笔记:
  • 我为输出 XML 文件选择了 UTF-8 编码,并将它们命名为 "$line.xml" ,即为每个输入行命名并将它们存储在当前位置;根据需要进行调整。
  • 执行模板扩展(插值)via automatic variable $ExecutionContext ,其.InvokeCommand属性提供访问 .ExpandString() 方法,允许按需执行字符串扩展(插值) , 就好像输入字符串是一个双引号字符串 - 见 this answer一个详细的例子。
  • 显示$ExecutionContext.InvokeCommand.ExpandString() 的功能通过 Expand-String 以更容易发现的方式进行方法cmdlet 是 this GitHub feature request 的主题.


  • Ansgar Wiechers指出 更简单的选择在这个简单的例子中——假设在模板扩展过程中只传递了一条信息——是到 。使用 PowerShell 的 string-formatting operator, -f 填写模板:
    # Define the XML file content as a *template* string literal
    # with '{0}' as the placeholder for the line variable, to
    # be instantiated via -f later.
    $template = @'
    <code>
    <?xml version="1.0"?>
    <Website xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Url>{0}.mydomain.com</Url>
    <Title>{0}</Title>
    <Enabled>true</Enabled>
    <PluginInName>Tumblr</PluginInName>
    </Website>
    '@


    # Loop over all input lines.
    Get-Content C:\temp\list.txt | ForEach-Object {
    # Expand the template based on the current $line value.
    $configFileContent = $template -f $_
    # Save the expanded template to an XML file.
    $configFileContent | Set-Content -Encoding Utf8 "$line.xml"
    }

    可选阅读:在 -f 之间进行选择和 $ExecutionContext.InvokeCommand.ExpandString()用于模板扩展:
    向 Ansgar 致敬以寻求帮助。
    使用 -f :
  • 好处:
  • 在调用时明确说明将填充哪些值。
  • 此外,在占位符中包含格式化指令更容易(例如,{0:N2} 以格式化带 2 个小数位的数字)。
  • 显式传递值允许在不同范围内轻松重用模板。

  • 如果您不小心传递了太少或太多的值,默认情况下会发生错误。

  • 缺点:
  • -f占位符总是位置和抽象的;例如,{2}只是告诉你你正在处理第三个占位符,但没有告诉你它的目的;在具有多个占位符的较大模板中,这可能会成为一个问题。
  • 即使您传递了正确数量的值,它们也可能以错误的顺序排列,这可能会导致细微的错误。


  • 使用 $ExecutionContext.InvokeCommand.ExpandString() :
  • 好处:
  • 如果您的变量具有描述性名称,您的模板将更具可读性,因为占位符 - 变量名称 - 将表明它们的用途。
  • 无需在调用时显式传递值 - 扩展仅依赖于当前范围内可用的变量。

  • 缺点:
  • 如果在多个函数(作用域)中使用模板,则需要确保在每个函数中都设置了模板中引用的变量。
  • 至少默认情况下,$ExecutionContext.InvokeCommand.ExpandString()将悄悄地忽略模板中引用的不存在的变量——这可能是也可能不是需要的。
  • 但是,您可以使用 Set-StrictMode -Version 2或更高版本来报告错误;使用 Set-StrictMode一般而言,这是一种很好的做法,但请注意其效果 isn't lexically scoped它可以disable convenient functionality .
  • 通常,您需要手动使模板与设置模板中引用的变量的代码保持同步,以确保填写正确的值(例如,如果引用的变量的名称发生更改,则模板字符串必须是也更新了)。

  • 关于arrays - 如何从 Powershell 中的值数组创建文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53797850/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com