首页 > 解决方案 > POWERSHELL 任务计划程序在 -Argument 内部传递变量

问题描述

下午好,我对 Powershell 很陌生,正在努力实现以下目标:

  1. 遍历文件夹目录

  2. 将文件夹名称设置为变量

  3. 创建任务

  4. 将变量(在步骤 2 中声明)作为在任务操作中调用的 -File 的必需参数传递

    Get-ChildItem -Path C:\Users\Paul\Documents\RSYNC -Directory -Recurse |ForEach-Object {
    $FolderName = $_.name
    
    $taskName = 'My Powershell Task_' + $FolderName
    
    # Create Action
    $Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File "C:\Users\Paul\Documents\RSYNC\Get-LatestAppLog.ps1" -name "$FolderName"' 
    
    # Create Trigger
    $Trigger = New-ScheduledTaskTrigger -Daily -At 12:35am
    
    # Create Settings
    $Settings = New-ScheduledTaskSettingsSet
    
    # Create Task
    $Task = New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Settings
    
    # Register Task
    Register-ScheduledTask -TaskName $taskName -InputObject $Task -User 'username' -Password 'password'
    }
    

任务是根据需要创建的,但是,问题是在$Action步骤中,不是在 $FolderName 变量中传递文件夹名称,而是将 $FolderName 作为字符串传递(我希望这是有道理的)。

如何正确地将文件夹名称传递给被调用的 PowerShell 脚本?

标签: powershellstring-interpolationquotingwindows-task-scheduler

解决方案


  • 您的直接问题是期望在逐字PowerShell 字符串文字$FolderName扩展(插值)对变量的引用, :'...'

    • 只有"..."字符串(双引号)在 PowerShell 中执行字符串插值:有关 PowerShell 的可扩展字符串(插值字符串)的概述,请参阅此答案有关 PowerShell 字符串文字的一般概述,请参阅此答案。
  • 虽然交换引号的使用 -用于"..."外部引用和嵌入引用以获得插值可能会根据情况工作 - 取决于目标程序或 API - 它在任务调度程序的上下文中不起作用'...'

    • 对于任务计划程序中的命令行- 通常在 Windows 上来自 PowerShell 之外 - 您也必须对嵌入的字符串使用"..."引号,因此需要转义 "`"(""也可以使用)。

    • 原因是当从外部调用其CLI时, PowerShell 不会将'字符视为具有语法功能,例如从任务计划程序cmd.exe,或 Windows 运行对话框 ( WinKey-R)。例如,如果传递给的路径-File'C:\Users\Paul\Documents\RSYNC\Get-LatestAppLog.ps1''字符。将被解释为路径的一部分

具体来说:

$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument `
 "-File `"C:\Users\Paul\Documents\RSYNC\Get-LatestAppLog.ps1`" -name `"$FolderName`"" 

请注意,您可以使用可扩展的here-string来简化引用;嵌入的"不需要转义:

$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument @"
 -File "C:\Users\Paul\Documents\RSYNC\Get-LatestAppLog.ps1" -name "$FolderName"
"@ 

推荐阅读