仅当记事本或exe文件正在运行时,Get-Process才会给出结果,但是我想知道某个文件夹中的特定文件(index.txt)是否正在运行,或者是否在Powershell中运行
答案 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工具)查找进程(在系统上运行)。以及正在运行的进程的路径信息。
您将看到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。