标签: powershell-workflow

如何在PowerShell中将命名参数定义为[ref]

我正在尝试使用[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 powershell-workflow

20
推荐指数
2
解决办法
2万
查看次数

了解PowerShell工作流中的功能范围

将以下内容复制并粘贴到新的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 powershell-workflow

12
推荐指数
1
解决办法
6537
查看次数

如何增加VM上的cuncurrent powershell实例数?

我试图触发一个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线程.我在这里错过了什么?

powershell powershell-4.0 powershell-workflow

6
推荐指数
1
解决办法
655
查看次数

从InlineScript调用函数

如何从嵌套的InlineScript中调用工作流中的函数?以下内容引发异常,因为该函数超出InlineScript的范围:

Workflow test
{
    function func1
    {
        Write-Verbose "test verbose" -verbose
    }

    InlineScript
    {
        func1
    }
}
test
Run Code Online (Sandbox Code Playgroud)

powershell powershell-workflow

5
推荐指数
1
解决办法
7211
查看次数

在PowerShell中从另一个函数调用一个函数

第一次使用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

5
推荐指数
1
解决办法
2万
查看次数

powershell的并行foreach最多使用5个线程吗?

参数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 parallel.for powershell-workflow

5
推荐指数
1
解决办法
4504
查看次数

无法通过任务计划程序恢复工作流程

在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 powershell-workflow

4
推荐指数
1
解决办法
4014
查看次数

如何隐藏 Select-AzureRmSubscription 的控制台输出

有谁知道如何在作为 powershell 工作流运行的 azure 工作簿中隐藏命令 Select-AzureRmSubscription 的输出

谢谢

azure azure-powershell powershell-workflow azure-automation

3
推荐指数
1
解决办法
2435
查看次数

在 Azure Runbook 之间传递自定义对象

我需要从另一个 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)

azure powershell-workflow azure-automation

0
推荐指数
1
解决办法
765
查看次数