主脚本中的变量是否转移到invoke-expression-script?

时间:2015-07-07 13:41:29

标签: powershell

我试图在每次创建新文件时运行脚本。我需要新文件的文件名和路径在我的Invoke-Expression Action脚本中工作。变量$ filePath是否转移到Action脚本?或者我是否需要在Action脚本中获取文件名?我有一个wokring sollution获取文件夹中的最新文件,但在最坏的情况下,如果文件几乎同时创建,那可能是错误的文件,所以我宁愿传输文件的路径\名称触发了文件wathcer脚本。我无法找到一种方法来解决该程序的作用(日志),所以我无法排除故障并找到它中断的点,但我没有结果,所以我知道它不起作用

$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $false              # <-- set this according to your requirements
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {  
    $FilePath = $Event.SourceEventArgs.FullPath
    Invoke-Expression C:\PSscript\Action.ps1
}

1 个答案:

答案 0 :(得分:0)

简答:这取决于定义变量的范围。父脚本定义的全局范围变量可从子脚本访问,但脚本或局部范围变量不可访问。

请注意,您根本不需要Invoke-Expression(和Microsoft advises against using it unnecesarily)。只需直接调用子脚本即可。

有几种方法可以从子脚本访问父脚本中定义的变量,但最好的方法是使用param(),因为您将明确地传递变量:

父脚本:

$FilePath = $Event.SourceEventArgs.FullPath
C:\PSscript\Action.ps1 -FilePath $FilePath # passing $FilePath to child

子脚本(在任何其他代码之前):

param(
    [String]$FilePath # acquiring $FilePath passed by parent
)

但是,如果你真的想隐式地在脚本之间传递变量,你可以简单地使用全局范围:

$global:FilePath = $Event.SourceEventArgs.FullPath
# Here you go, $global:FilePath is now accessible from anywhere in the session, including
# script blocks, functions and child scripts.