【问题标题】:Setting a (string) variable equal to another (string) variable including modifications将(字符串)变量设置为等于另一个(字符串)变量,包括修改
【发布时间】:2021-05-21 01:30:11
【问题描述】:

我正在尝试在 可重用 PowerShell(v5.1,但与 v-agnostic)脚本的大规模库中做得更好,我有一个非常简单的任务将用于说明。来自 C# 的伪代码,用于从另一个变量创建变量,进行一些更改看起来像

string somevar = "foo";
string someothervar = DoSomethingTo(somevar); // lots of variations HERE
Debug.Print someothervar;

假设这是一个简单的replace 操作。我不会费心用 C#(或 PoSh)编写它,但由于它本质上是一种脚本语言,所以我可以为 replace 找到的每个博客或文档类型的示例看起来都类似于

> $somevar = "foo"
> {# here are 3 ways to say replace in PowerShell}
> # here is some console output of what happens when you do that

我不关心控制台输出。我关心了解所有 PowerShell-native 方法,我可以在$somevar 上使$someothervar 脱离操作,例如替换其中的一部分。 (我知道我基本上可以调用 .NET。)

如果我以更糟糕的方式问这个问题,那就是“如何使用其他 PowerShell 变量和/或参数在内联操作中设置本地 PowerShell 变量”。

【问题讨论】:

  • 您介意重新表述您的问题吗?很难理解你想要什么。您是否正在寻找有关 Powershell 变量如何工作的更深入的解释?
  • @AbrahamZinala 我确实研究了措辞,信不信由你,之前很长一段时间,然后在此发布。 (我认为身体本身是这样说的。)但我同意,它仍然很烂。这可能是 PoSh noob 的失败,并且可能不会帮助任何人。在 C# 中使用一系列链式操作设置变量非常简单。将其设置为 PoSh 中不存在 .NET 更难(至少对我而言,到目前为止)。抱歉,我帮不上忙,希望更明确和更狭隘。
  • 我仍然很困惑为什么你认为你不能在 PowerShell 中做到这一点。无论您将多少东西链接在一起,这些表达式的输出都会被变量捕获,这并不重要。

标签: powershell local-variables powershell-module


【解决方案1】:

在 PowerShell 中,任何输出都可以分配给变量。如果它没有被分配或以其他方式被消耗,它将输出到主机,通常是控制台。

您从伪代码派生的示例可能类似于:

$SomeOtherVar = $SomeVar -replace "one", "two"

如果您在字符串上调用 .Net 方法也是如此:

$SomeOtherVar = $SomeVar.Replace( "one", "two" )

同样重要的是分配命令的输出,该命令可以是 cmdlet、函数甚至是命令行可执行文件。

注意:调用函数和 cmdlet 在 PowerShell 中略有不同。不要在括号中指定参数。用空格分隔参数和实参和/或使用命名参数。

$SomeOtherVar = Get-SomeData $SomeVar

$SomeOtherVar = Ping $SomeVar

您的问题的总结答案是任何 PowerShell 输出都可以分配给变量。因此,从字面上看,您对$SomeVar 所做的任何即使输出为空也会生成输出的操作都可以分配给$SomeOtherVar

回复评论/附加示例:

$SomeVar = 'foo'
$SomeOtherVar = $SomeVar -replace 'foo', 'bar'
$SomeOtherVar

输出:bar

【讨论】:

  • 感谢您的详尽回答,所以也许我问错了问题?我有例如从字面上尝试(两个)您的第一个示例和$SomeOtherVar 不断出现空值。
  • 我不知道您所说的“出现空值”是什么意思。
  • 对不起,我知道 cmets 不应该是后续行动,但仍然不存在(因为,我的代码也是这么说的)。我认为$SomeVar 是参数、变量还是文字没有区别?比如说,像 RegEx 这样更高级的查找/替换呢? (也许更重要的是复杂的内联操作?我无法确定或者我不会问。)
  • -replace 将 RegEx 作为第一个参数。 [RegEx] .Net 类也可以访问。变量、参数和文字之间肯定存在差异。不过,这个范围很广,这里就不多说了。 Bruce Payette 的睡前阅读推荐“PowerShell In Action”。它解释了很多。如果您来自 C# 之类的语言,这可能会特别有用。
  • 很明显,这不是一个好问题,我很抱歉,我的范围更窄,我的时间线比整本书的潜水要紧,但我很感激你的建议和时间草垛。如果没有其他办法可以解决这个问题,会让这个腌制时间更长一点,并接受失败。
【解决方案2】:

所以我觉得这篇文章有点令人困惑和有趣。史蒂文的答案是一个很好的答案,但似乎没有以某种方式通过,所以我会尝试在那里扔一些代码并希望能坚持下去。如果没有,至少我试过了吧?

function Append-BarToString {
    param(
        [string]$InputString
    )
    # explicit return keyword not needed.  
    # Any output inside function not assigned  
    # to a variable or to $null will be sent out
    $InputString + "Bar" 
}

# function can also be written without param block 
# more like C# like this, though it is unconventional
function Append-BarToString ([string]$InputString)
{
    # $InputString + "Bar"
    # or 
    "${InputString}Bar"
}

$someVar = 'foo'
$someOtherVar = Append-BarToString $someVar


$someOtherVar
# or
Write-Host $someOtherVar

# output
# fooBar
# fooBar

【讨论】:

  • 谢谢,这是对function 语法的一个很好的介绍,但我只尝试使用内联/本机/公共插件。我们正在取得进展,即使是盲目的!
  • 好吧,无论如何,希望你能找到你要找的东西。我这样回答的原因是因为你的伪代码示例。它包括使用一个函数来DoSomethingTo()你的变量。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多