我试图在每次创建新文件时运行脚本。我需要新文件的文件名和路径在我的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
}
答案 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.