1

我知道我可以点源文件:

. .\MyFunctions.ps1

但是,我想在字符串变量中点源命令:

. $myFuctions

我看到这是可能的:

.{$x=2}

在获取脚本块之后,$x 等于 2。

但是...... .{$myFunctions}不起作用。

我试过$myFunctions | Invoke-Expression了,但它没有将源函数保持在当前范围内。我能想到的最接近的是将变量写入临时文件,点源文件,然后删除文件。

难免会有人问:“你到底想干什么?” 所以这是我的用例:

我想混淆一些我打算从另一个脚本调用的函数。我不想混淆主脚本,只是我的附加功能。我有一个用户群,需要根据他们的网络、目录结构和其他本地因素调整主脚本,但我不希望修改某些功能。我也想保护源代码。因此,另一个问题是:保护 PowerShell 脚本代码的好方法是什么?

我从 PowerShell 将执行 Base64 编码字符串的想法开始,但仅在使用 -EncodedCommand 在命令行上传递时。我首先想点源一个编码命令,但我想不通。然后我决定,如果我将 Base64 文件转换为解码字符串并点源字符串变量的值,那么它对于我的目的来说已经足够“模糊”了。但是,如果不将解码的源写入文件,我无法弄清楚如何点源它。

如果可以的话,它会满足我的需求Import-Module -EncodedCommand .\MyEncodedFile.dat

4

3 回答 3

3

实际上,有一种方法可以实现这一目标,而您几乎就在那里。

首先,正如您已经说过的,源或点运算符通过提供路径(作为字符串)或脚本块来工作。另见:。(源或点运算符)

因此,当尝试对字符串变量进行点源时,PowerShell 认为它是一条路径。但是,由于点源脚本块的可能性,您可以执行以下操作:

# Make sure everything is properly escaped.
$MyFunctions = "function Test-DotSourcing { Write-Host `"Worked`" }"

. { Invoke-Expression $MyFunctions }

Test-DotSourcing

点源函数作为字符串

你成功地从一个字符串变量中获取你的函数!

解释:

  • 随着Invoke-Expression字符串被评估并在子范围(脚本块)中运行。
  • 然后.将评估的表达式添加到当前范围。

也可以看看:

于 2021-04-15T09:42:22.303 回答
0

虽然@dwettstein 的答案是一种可行的方法,Invoke-Expression用于处理函数存储为字符串的事实,但还有其他方法似乎可以在下面实现相同的结果。

我不太清楚的一件事是范围界定本身,Invoke-Expression不会创建新范围,因此当时并不完全需要点源......

#Define your function as a string
PS> $MyUselessFunction = "function Test-WriteSomething { 'It works!' }"

#Invoke-Expression would let you use the function
PS> Invoke-Expression $MyUselessFunction
PS> Test-WriteSomething
It works!

#Dot sourcing works fine if you use a script block
PS> $ScriptBlock = [ScriptBlock]::Create($MyUselessFunction)
PS> . $ScriptBlock
PS> Test-WriteSomething
It works!

#Or just create the function as a script block initially
PS> $MyUselessFunction = {function Test-WriteSomething { 'It works!' }}
PS> . $MyUselessFunction
PS> Test-WriteSomething
It works!

换句话说,可能有无数种方法可以得到与您想要的相似的东西——其中一些记录在案,而另一些则从现有文档中推测出来。如果您的函数定义为字符串,则Invoke-Expression可能需要,或者您可以将它们转换为脚本块并点源它们。

于 2021-11-25T11:25:09.267 回答
-4

目前无法点源字符串变量。 我站纠正!. { Invoke-Expression $MyFunctions } 绝对有效!

于 2020-06-30T15:38:23.533 回答