【问题标题】:Exit powershell script退出powershell脚本
【发布时间】:2017-04-11 15:26:09
【问题描述】:

我有这个 powershell 脚本,当在某个目录中创建文件时会触发一些指令。 一切正常,但在操作完成后我无法关闭 powershell。 我该怎么做?

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Users\Autostrade\CartellaSFTP"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true  
$uscita = 0

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
            $changeType = $Event.SourceEventArgs.ChangeType
            $logline = "$(Get-Date), $changeType, $path"
            Add-content "C:\Users\Autostrade\PHP Script Dati Telepass\log.txt" -value $logline
            # Set up references to executable and script
            $PhpExe  = "C:\PHP\php.exe"
            $PhpFile = "C:\Users\Autostrade\PHP Script Dati Telepass\script.php"

            # Create arguments from Script location
            # usually php.exe is invoked from console like: 
            # php.exe -f "C:\path\myscript.php"
            #$PhpArgs = '-f "{0}"' -f $PhpFile

            # Invoke, using the call operator
            $PhpOutput = & $PhpExe $PhpFile
            PhpOutput
            $uscita = 1
          }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
Register-ObjectEvent $watcher "Created" -Action $action
#Register-ObjectEvent $watcher "Changed" -Action $action
#Register-ObjectEvent $watcher "Deleted" -Action $action
#Register-ObjectEvent $watcher "Renamed" -Action $action
while (!$uscita) {sleep 5}
exit

我尝试使用“$uscita”变量来停止 while 并退出,但它不起作用。我还尝试将退出命令放在操作的末尾,但这也不起作用

【问题讨论】:

  • $uscita = 1 -> $using:uscita = 1
  • 我试过了.. powershell 给出了一些错误并立即关闭.. 我无法读取错误是什么
  • 删除 exit 并从 PowerShell 提示符运行脚本。
  • 它给了我这个异常:CategoryInfo: ParseError (:) [], ParseExceptionfullyQualifiedErrorId: InvalidLeftHandSide
  • edit您的问题并显示完整的错误。不要发布屏幕截图;将其复制/粘贴为文本。

标签: powershell


【解决方案1】:

我以这种方式编辑了代码的最后一部分,现在它可以工作了。所以在动作之后,脚本会自行结束。 代码如下:

while (!$uscita) {
if($? -eq $false) {
    exit
    }
sleep 5}

【讨论】:

    【解决方案2】:

    看起来你的倒数第二行 while 可能返回 true,所以它只是位于 sleep 命令中。

    试试这个测试,如果最后一个命令成功完成,它会返回true。

    while (!$uscita) {write-output $?; sleep 5}
    

    【讨论】:

    • 好的,我试过了。当我在我正在监视的目录中插入一个文件时,它给了我“错误”..但是循环不会停止。它继续并返回 true
    • 有道理,我们越来越近了。美元?将告诉您(真/假)上一个命令是否成功并且确实成功了。现在我想知道:你说“它给了我'假'”,你的意思是语句!$uscita 返回$true吗? (意思是 $uscita -eq $false)。
    • 我不确定您发布的答案是否是最好的方法。考虑设置 $uscita = $true,而不是设置 $uscita = 1。然后进行故障排除使用 - while (!$uscita) {write-output $uscita;睡觉 5}。如果这仍然无限循环,则意味着 $uscita = $true 行没有被击中。开始将其他写入输出放在 $action 块或更高的位置,以便您可以看到问题出在哪里。不要忘记对函数 PhpOutput 进行故障排除。那里的意外行为可能会阻止 $uscita 被设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2016-08-19
    • 2018-02-12
    • 2021-08-16
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多