主脚本中的变量是否传输到调用表达式脚本



我试图使一个脚本运行每次创建一个新文件。我需要新文件的文件名和路径才能在我的Invoke-Expression Action脚本中工作。变量$filePath传输到动作脚本吗?或者我是否需要在Action脚本中获取文件名?我有一个有效的解决方案,获得文件夹中的最新文件,但在最坏的情况下,这可能是错误的文件,如果文件几乎同时创建,所以我更愿意传输触发文件监视脚本的文件的路径名称。我找不到一种方法来观察程序做了什么(日志),所以我不能排除故障并找到它中断的点,但我没有得到结果,所以我知道它不起作用

$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:PSscriptAction.ps1
}

简短的回答:这取决于变量定义的作用域。父脚本定义的全局作用域变量可以从子脚本访问,但脚本或局部作用域变量不能。


注意,您根本不需要调用表达式(Microsoft建议不要不必要地使用它)。直接调用子脚本。

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

$FilePath = $Event.SourceEventArgs.FullPath
C:PSscriptAction.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.

最新更新