如何使用Powershell检测特殊文件是否正在运行?

时间:2018-07-28 07:59:46

标签: powershell

仅当记事本或exe文件正在运行时,Get-Process才会给出结果,但是我想知道某个文件夹中的特定文件(index.txt)是否正在运行,或者是否在Powershell中运行

3 个答案:

答案 0 :(得分:1)

您可以使用$json = file_get_contents('php://input'); $action = json_decode($json, true); $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $txt = $action; fwrite($myfile, $txt); fclose($myfile); 方法,然后选择正在运行的进程的名称。像这样-

mainWindowTitle

这将为您提供正在运行的记事本进程的列表,如果您在get-Process notepad | where-Object {$_.mainWindowTitle} | Select-Object id, name, mainwindowtitle 标头下找到文件index.txt,则可以确认文件确实在运行。

答案 1 :(得分:1)

Get-Process获取所有正在运行的进程。 文本文件不是进程,它当然是由/在进程(无论PS是否启动),记事本,winword等中打开的对象。

PS可用于启动一个进程,例如记事本,但PS不拥有它,而exe却拥有它。

因此,在您所要求的上下文中,文件从未在PS中运行,可以使用Get-Process(或由Get-Process替换的旧Tasklist工具)查找进程(在系统上运行)。以及正在运行的进程的路径信息。

  1. 手动启动记事本并打开一个文本文件。
  2. 运行Get-Process并询问记事本过程的所有值。

您将看到Get-Process带来了很多信息供您选择。 请注意,它是MainWindowTitle,它显示记事本进程已打开的文件,但是在此结果的任何地方都没有说该文件(路径)从何处运行。

Get-Process Notepad | Select-Object *

Name                       : notepad
Id                         : 20516
...
Path                       : C:\WINDOWS\system32\notepad.exe
Company                    : Microsoft Corporation
CPU                        : 2.515625
ProductVersion             : 10.0.17134.1
Description                : Notepad
Product                    : Microsoft® Windows® Operating System
__NounName                 : Process
...
MainWindowTitle            : news-stuff.txt - Notepad
MainModule                 : System.Diagnostics.ProcessModule (notepad.exe)
...

答案 2 :(得分:1)

注意:

  • 此答案告诉您如果当前某文件处于打开状态。

  • 如果您还需要知道(哪个进程)已打开,请参见this related question的答案,但请注意,它们都需要安装实用程序({ {1}}或具有管理权限(handle.exe)的系统的先前配置

  • 如果您想以方便的方式包装此答案中介绍的技术,则可以从this Gist下载函数openfiles,该功能支持在给定目录[subtree]中查找所有打开的文件。 。


文件与进程不同,它们不是运行,因此我假设您要测试文件当前是否打开 (已打开(可能是通过其他过程打开的,用于读取和/或写入,但尚未关闭)。

以下代码段检测当前目录中的文件Get-OpenFiles。目前已在其他地方打开

someFile.txt

请注意$isOpen = try { [IO.File]::Open("$PWD/someFile.txt", 'Open', 'Read', 'None').Close() $false # file NOT open elsewhere } catch { # See if the exception is a sharing / locking error, which indicates that the file is open. if ( $_.Exception.InnerException -is [System.IO.IOException] -and ($_.Exception.InnerException.HResult -band 0x21) -in 0x21, 0x20 ) { $true # file IS open elsewhere } else { Throw # unexpected error, relay the exception } } $isOpen # echo the result 之前的$PWD/,它明确地在当前目录前添加路径,以便传递完整的文件名。这是必需的,因为.NET框架通常具有不同的当前目录。但是,在所有 情况下都不能使用someFile.txt作为前缀;您可以阅读有关它的更多信息,并找到功能强大的解决方案here

代码尝试使用排他锁(共享模式为$PWD/)打开文件以进行读取,如果文件当前处于打开状态,则会失败。

但是请注意,该仅在您拥有至少读取文件的权限时有效。
如果不这样做,则无法执行测试,并且代码将中继发生的None;同样,也会中继来自其他意外情况的异常,例如指定的文件不存在[System.UnauthorizedAccessException])。

[System.IO.FileNotFoundException]可以指示一定范围的错误情况(并且运算符[System.IO.IOException]也匹配派生的类,例如-is),以便专门检测共享/ locking错误,代码必须测试包含Win32 API错误代码[System.IO.FileNotFoundException].HResult的异常的ERROR_SHARING_VIOLATION (0x20)属性。

退后一步:如果最终目的是自己自己处理文件[content] ,则最好不要执行单独的测试 >事先,因为在执行测试与随后尝试打开文件之间可能会再次打开该文件; 相反,只需尝试自己打开文件并处理任何故障-参见this (C#-based) answer