无法从批处理文件执行PowerShell脚本以在CMD模式下运行

时间:2017-03-20 20:07:29

标签: c# powershell batch-file cmd

我为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

1 个答案:

答案 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时才能工作 - 而且由于你的字符串引用问题较少,它会更好一点。