我正在尝试使用[ref]命名参数.但是,我收到一个错误:
workflow Test
{
Param([Parameter(Mandatory=$true)][String][ref]$someString)
write-verbose $someString -Verbose
$someString = "this is the new string"
}
cls
$someString = "hi"
Test -someString [ref]$someString
write-host $someString
#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument.
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
将以下内容复制并粘贴到新的Powershell ISE脚本中,然后点击F5:
workflow workflow1{
"in workflow1"
func1
}
function func1 {
"in func1"
func2
}
function func2 {
"in func2"
}
workflow1
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
术语"func2"不被识别为cmdlet,函数,脚本文件或可操作程序的名称
我不明白这一点.为什么func1会在范围内而不是func2?任何帮助非常感谢.TIA.
我试图触发一个PowerShell工作流程,它应该并行旋转10个线程.我正在使用PS版本4.代码 -
Workflow CreateVMs
{
$i = 0
#somecodehere...
foreach -parallel -throttlelimit 10($i in 0..30)
{
#somemorecodehere...
# INVOKING BATCH FILE USING POWERSHELL
}
}
Run Code Online (Sandbox Code Playgroud)
我在内联脚本中使用powershell调用批处理文件.我在任务管理器中观察到的是,一次只有5个线程处于活动状态 -
可能是下一个获取的线程只有五个中的一个完成.我从未见过超过5 ps的实例.但是,当我检查每个用户允许的ps会话时,它远远超过5.
如何在PS工作流程中并行旋转10个PS线程.我在这里错过了什么?
如何从嵌套的InlineScript中调用工作流中的函数?以下内容引发异常,因为该函数超出InlineScript的范围:
Workflow test
{
function func1
{
Write-Verbose "test verbose" -verbose
}
InlineScript
{
func1
}
}
test
Run Code Online (Sandbox Code Playgroud) 第一次使用PowerShell 5时,我无法调用一个将消息从另一个函数写入文件的函数。以下是我正在做的简化版本。
workflow test {
function logMessage {
param([string] $Msg)
Write-Output $Msg
}
function RemoveMachineFromCollection{
param([string]$Collection, [string]$Machine)
# If there's an error
LogMessage "Error Removing Machine"
# If all is good
LogMessage "successfully remove machine"
}
$Collections = DatabaseQuery1
foreach -parallel($coll in $Collections) {
logMessage "operating on $coll collection"
$Machines = DatabaseQuery2
foreach($Mach in $Machines) {
logMessage "Removing $Mach from $coll"
RemoveMachineFromCollection -Collection $coll -Machine $Mach
}
}
}
test
Run Code Online (Sandbox Code Playgroud)
这是它生成的错误:
术语'logMessage'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。
+ CategoryInfo:ObjectNotFound:(logMessage:String)[],CommandNotFoundException
+ FullyQualifiedErrorId:CommandNotFoundException
+ PSComputerName:[本地主机]
我尝试过在文件中四处移动logMessage函数,甚至尝试使用全局范围。
用任何其他语言,我都可以从任何其他函数中调用logMessage。这就是功能的目的。 …
powershell workflow function powershell-workflow powershell-5.0
参数throttlelimit可以foreach -parallel控制执行脚本时使用多少个进程。但即使我设置的进程数大于 5,我也不能拥有throttlelimit超过 5 个进程。
该脚本在多个 powershell 进程中执行。所以我检查脚本内的PID。然后对 PID 进行分组,以便我可以知道有多少个进程用于执行该脚本。
function GetPID() {
$PID
}
workflow TestWorkflow {
param($throttlelimit)
foreach -parallel -throttlelimit $throttlelimit ($i in 1..100) {
GetPID
}
}
foreach ($i in 1..8) {
$pids = TestWorkflow -throttlelimit $i
$measure = $pids | group | Measure-Object
$measure.Count
}
Run Code Online (Sandbox Code Playgroud)
输出是
1
2
3
4
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
对于$i小于或等于5,我有$i流程。但对于$i超过 5 个进程,我只有 5 个进程。有什么办法可以增加执行脚本时的进程数吗?
编辑:为了回应@SomeShinyObject的答案,我添加了另一个测试用例。这是@SomeShinyObject 给出的示例的修改。我添加了一个函数S,它除了休眠 10 …
在PowerShell窗口中,我运行以下工作流程:
workflow foo { Suspend-Workflow; "hello world" | Out-File c:\users\weijgerss\desktop\foo.txt }
Run Code Online (Sandbox Code Playgroud)
然后,为了恢复工作流程,我通过触发在启动时运行的任务调度程序进行了以下调度:
Import-Module PSWorkflow
$jobs = Get-Job -state Suspended
$jobs > c:\users\weijgerss\desktop\zqqfff.txt
$resumedJobs = $jobs | resume-job -wait
$resumedJobs | wait-job
# Task scheduler action: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Normal -NoLogo -NoProfile -Command "&'c:\users\weijgerss\desktop\resume.ps1'"
Run Code Online (Sandbox Code Playgroud)
工作流程既不会在启动时恢复,也不会通过任务计划程序手动触发它.zqqfff.txt的内容表明任务调度程序激活的PowerShell无法查看工作流.当我运行Get-Job时,常规的PowerShell窗口可以看到工作流程.
(正常的PowerShell窗口和任务调度程序powershell实例都以同一用户身份运行.)
我使用procmon看看发生了什么,我可以从中看到,当powershell正常与taskscheduler时,它正在查看不同的工作流持久性路径,即:
C:\ Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL(正常的PowerShell窗口使用此文件夹)C:\ Users\weijgerss\AppData\Local\microsoft\windows\PowerShell\WF\PS\default\S-1-5-21-3519956147-933941082-741972881-500_EL_NI(任务调度程序激活的powershell实例使用此文件夹)
我完全难过了.如何让任务调度程序激活PowerShell实例以查看与普通PowerShell窗口相同的工作流程?
有谁知道如何在作为 powershell 工作流运行的 azure 工作簿中隐藏命令 Select-AzureRmSubscription 的输出
谢谢
我需要从另一个 runbook 调用一个 runbook,并在 azure 自动化中获取一个自定义对象作为输出。如果被调用的 Runbook 返回 int 或 string 但无法完成返回自定义对象,则它工作正常。 被调用的 Runbook 的一个简单示例是
workflow CalledRunbook
{
[OutputType([Object])]
$obj1=@{"key1"="value1"}
$obj1
}
Run Code Online (Sandbox Code Playgroud)
现在这个 Runbook 是从 CallingRunbook 调用的,我需要打印这个 obj1
workflow CallingRunbook
{
#After doing proper authentication
$job = Start-AzureAutomationRunbook -Name "CalledRunbook" -AutomationAccountName $AutomationAccountName
$doLoop = $true
while($doLoop) {
Start-Sleep -s 5
$job = Get-AzureAutomationJob -Id $job.Id -AutomationAccountName $AutomationAccountName
$doLoop = (($job.Status -notmatch "Completed") -and ($job.Status -notmatch "Failed") -and ($job.Status -notmatch "Suspended") -and ($job.Status -notmatch "Stopped"))
}
$jobout = Get-AzureAutomationJobOutput `
-Id …Run Code Online (Sandbox Code Playgroud)