我找不到传递函数的方法。只是变数。
没有将函数放在 ForEach 循环中的任何想法?
function CustomFunction {
Param (
$A
)
Write-Host $A
}
$List = "Apple", "Banana", "Grape"
$List | ForEach-Object -Parallel {
Write-Host $using:CustomFunction $_
}
Run Code Online (Sandbox Code Playgroud)
今天,我在 Powershell 5.1 中使用制表符自动完成功能来输入变量名称,并注意到其中一个选项是 PSDrive 的名称。驱动器名称是docs,我想要扩展的驱动器名称是$document_name。当我输入 时$do<tab>,shell 确实扩展了我输入的内容$document_name,但由于某种原因,我第二次输入<tab>,此时扩展的文本更改为$docs:。
我进一步探索并发现我的每个 PSDrive 都存在这种类型的变量,或者至少选项卡扩展表明它确实存在。
\n\n更正式地说,对于每个 PSDrive PSD,选项卡扩展都认为这$PSD:是有效的事情。
我的问题很简单:这些到底是什么?以下是我迄今为止所做的一些观察:
\n\n$,因此它们看起来像 PS 变量。对于本次讨论的其余部分(以及上面前面的讨论),我将假设它们是变量并这样引用它们。Variable:像大多数变量一样列在 PSDrive 中。这样,它的行为就像$env“变量”,也没有在 中列出Variable:。我有一种感觉,如果我能找到有关 的文档$env,那么我也会理解这些对象。readme.txt包含文本“Hello, world!” 在名为 的 PSDrive 上code,则以下所有内容都可能与 Powershell 交互。获取文件的内容。
\n\n\xce\xbb ${code:\\readme.txt}\nHello, world!\nRun Code Online (Sandbox Code Playgroud)\n\n只是为了证明上面结果的类型是String:
我正在尝试执行Invoke-Sqlcmd命令(来自SqlServer 模块)以作为不同的 AD 用户运行查询。我知道有-Credential争论,但这似乎不起作用。
因此,我认为 usingStart-Job可能是一种选择,如下面的代码片段所示。
$username = 'dummy_domain\dummy_user'
$userpassword = 'dummy_pwd' | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential ($username, $password)
$job = Start-Job -ScriptBlock {Import-Module SqlServer; Invoke-Sqlcmd -query "exec sp_who" -ServerInstance 'dummy_mssql_server' -As DataSet} -Credential $credential
$data = Receive-Job -Job $job -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)
但是,在查看作业返回的变量类型时,这不是我所期望的。
> $data.GetType().FullName
System.Management.Automation.PSObject
> $data.Tables[0].GetType().FullName
System.Collections.ArrayList
Run Code Online (Sandbox Code Playgroud)
如果我ScriptBlock直接在 中运行代码,这些是 PS 返回的变量类型:
> $data.GetType().FullName
System.Data.DataSet
> $data.Tables[0].GetType().FullName
System.Data.DataTable
Run Code Online (Sandbox Code Playgroud)
我尝试将$data变量强制转换为[System.Data.DataSet],这导致了以下错误消息:
Cannot convert …Run Code Online (Sandbox Code Playgroud)