我为FileWatcher创建了一个PowerShell脚本。我需要在C#中执行它。我试过很多方面,但它没有用。我甚至创建了一个批处理文件来执行我的脚本。仍然没有工作,只需控制台打开和关闭。但是当我在命令提示符下手动运行每一步时,我能够执行脚本。
以下是我的PowerShell脚本:
$folder = 'D:\'
$filter = '*.csv'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false;
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp" -Fore red
Out-File -FilePath D:\outp.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"
}
以下是批处理文件
D:
powershell.exe
powershell Set-ExecutionPolicy RemoteSigned
./FileWatcherScript
答案 0 :(得分:0)
要从Powershell调用脚本,您应该使用-File
参数。我将您的批处理文件更改为如下所示 - 您只需要这一行:
powershell.exe -ExecutionPolicy RemoteSigned -File D:\FileWatcherScript.ps1
在不传递任何参数的情况下启动powershell.exe
,如在帖子中的批处理脚本中,将始终启动必须手动退出的交互式shell。要以编程方式通过Powershell运行命令并在完成时退出,可以像上面那样传递-File
参数,或者传递带有字符串或脚本块的-Command
参数。以下是使用字符串的-Command
参数的简短示例:
powershell.exe -Command "Invoke-RestMethod https://example.com/api/do/thing; Invoke-RestMethod https://example.com/api/stop/otherthing"
该调用在两个不同的URL上调用Invoke-RestMethod两次,并演示您可以用分号(;
)分隔命令以一个接一个地运行。
您也可以将脚本块传递给-Command
,但请注意,这仅适用于其他Powershell会话中的 。看起来像这样:
powershell.exe -Command { Invoke-RestMethod https://example.com/api/do/thing; Invoke-RestMethod https://example.com/api/stop/otherthing }
该调用与前一个调用完全相同。不同之处在于它使用的是一个脚本块 - 一个Powershell结构,它只能在父shell也是Powershell时才能工作 - 而且由于你的字符串引用问题较少,它会更好一点。