Powershell在启动作业调用时将数据以文本形式存储在变量中
我有一个脚本,可以在启动时生成日志文件,在其中写入内容,然后完成。 它在主脚本上运行得很好,但是当使用start job将变量传递给子脚本时,会再次对其求值 下面是我如何定义此变量的:Powershell在启动作业调用时将数据以文本形式存储在变量中,powershell,jobs,Powershell,Jobs,我有一个脚本,可以在启动时生成日志文件,在其中写入内容,然后完成。 它在主脚本上运行得很好,但是当使用start job将变量传递给子脚本时,会再次对其求值 下面是我如何定义此变量的: $logFile = (Get-Location|Select -expand Path)+"\"+(Get-Date -uformat "%Y-%m-%d-%H-%M-%S")+".log" 以下是我如何在主脚本中写入要登录的数据: "here is some log data" | Out-File -Fi
$logFile = (Get-Location|Select -expand Path)+"\"+(Get-Date -uformat "%Y-%m-%d-%H-%M-%S")+".log"
以下是我如何在主脚本中写入要登录的数据:
"here is some log data" | Out-File -FilePath $logFile -Append
以下是我如何开始工作:
$job=Start-Job -Name "myjob" -FilePath ".\worker.ps1" -ArgumentList
$logFile
问题是,当我将数据写入worker.ps1子脚本内的日志时,$logfile值会再次求值,然后我会得到多个不同的日志文件,而不是一个:因为在使用start job调用$logfile时,似乎会再次求值
我的工人看起来像这样:
Param (
[Parameter(Mandatory=$True)]
[string]$logFile
)
"This is a test" | Out-File -FilePath $logFile -Append
我最后吃了
2017-02-20-13-55-23.log
2017-02-20-13-56-20.log
2017-02-20-13-57-14.log
我相信这不是它应该如何工作,$logFile变量不应该再次得到评估,但在工作中我得到了一些有趣的经验,我想在这方面得到一些帮助
感谢您的想法既然您面临这个问题,我建议您将这一行放在您的worker.ps1中。这将帮助您:
Param (
[Parameter(Mandatory=$True)]
[string]$logFile
)
Remove-Variable logFile -Force -ErrorAction Ignore
"This is a test" | Out-File -FilePath $logFile -Append
这将在每次之前删除该变量,以便启动$logfile的新实例
希望有帮助。您是否考虑过使用环境变量,或使用
设置变量创建变量,并指定更大的范围?好主意!我尝试了“设置变量-名称“logFile”-值((获取位置|选择-扩展路径)+“\”+(获取日期-格式“%Y-%m-%d-%H-%m-%S”)+“=.log”)-选项常量-作用域全局”,但我遇到了相同的问题:(使用powershell有时很难获得简单的东西。我认为我的问题可以总结如下:“如何将cmdlet生成的文本存储在变量中而不是生成代码中”。我需要一个$logFile=(一些cmdlet).ToStringandnototherextremelyAnnoyingPowerShellObjects嗯,我认为问题不在于你认为它是什么。字符串是一个字符串,它不会重新计算,而你拥有的是一个字符串。检查你定义$logfile的位置,确保它不在任何循环或任何东西中,也确保你没有在你的下标中定义它。试试环境改为ent变量。全局将不会与作业共享。