windows下没有类似nohup的命令但是可以使用其他命令进行实现此功能
一、用到的命令解释:
1、Start-Process:启动本地计算机上的一个或多个进程。
相关介绍链接:Start-Process (Microsoft.PowerShell.Management) | Microsoft Learn
主要用到的参数
1.1、 -WindowStyle
指定用于新进程的窗口的状态。 此参数的可接受值为: **Normal**、 **Hidden**、 **最小化**和 **最大化**。 默认值为 **Normal**。
1.2、 -FilePath
指定进程中运行的程序的可选路径和文件名。 输入与计算机上的程序关联的可执行文件或文档的名称,例如 .txt
或 .doc
文件。 此参数是必需的。
1.3、-RedirectStandardOutput
指定文件。 此 cmdlet 将进程产生的输出发送给指定的文件。 输入路径和文件名。 默认情况下,在控制台中显示该输出。
2、tasklist
直接powershell中输入 tasklist /? 即可查看帮助
TASKLIST [/S system [/U username [/P [password]]]]
[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述:
该工具显示在本地或远程机器上当前运行的进程列表。
参数列表:
/S system 指定连接到的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果省略,则
提示输入。
/M [module] 列出当前使用所给 exe/dll 名称的所有任务。
如果没有指定模块名称,显示所有加载的模块。
/SVC 显示每个进程中主持的服务。
/APPS 显示 Microsoft Store 应用及其关联的进程。
/V 显示详细任务信息。
/FI filter 显示一系列符合筛选器
指定条件的任务。
/FO format 指定输出格式。
有效值: "TABLE"、"LIST"、"CSV"。
/NH 指定列标题不应该
在输出中显示。
只对 "TABLE" 和 "CSV" 格式有效。
/? 显示此帮助消息。
筛选器:
筛选器名称 有效运算符 有效值
----------- --------------- --------------------------
STATUS eq, ne RUNNING | SUSPENDED
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号
SESSIONNAME eq, ne 会话名称
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 小时,
mm - 分钟,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用(以 KB 为单位)
USERNAME eq, ne 用户名,格式为
[域\]用户
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
模块 eq, ne DLL 名称
注意: 当查询远程计算机时,不支持 "WINDOWTITLE" 和 "STATUS"
筛选器。
Examples:
TASKLIST
TASKLIST /M
TASKLIST /V /FO CSV
TASKLIST /SVC /FO LIST
TASKLIST /APPS /FI "STATUS eq RUNNING"
TASKLIST /M wbem*
TASKLIST /S system /FO LIST
TASKLIST /S system /U 域\用户名 /FO CSV /NH
TASKLIST /S system /U username /P password /FO TABLE /NH
TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
3、for循环
1、读取文本内容
@echo off
for /f %%i in (test.txt)do (
echo %%i
)
pause > nul
2、/f 的tokens
文件内容如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@echo off
for /f "delims=: tokens=7" %%i in (test.txt)do (
echo %%i
)
结果如下:
/bin/bash
/sbin/nologin
二、具体脚本
1、后台执行程序脚本bat
@echo off
powershell.exe -command "& {Start-Process -WindowStyle hidden -FilePath 'D:\develop\frp\frpc.exe' '-c D:\develop\frp\frpc.ini' -RedirectStandardOutput 'D:\develop\frp\frp_log.log'}"
powershell.exe -command "&{ tasklist /fi 'IMAGENAME eq frpc.exe' > D:\develop\frp\now_pid.pid}"
执行脚本解释
①我这用的是frpc的exe执行程序 需要传一个参数 -c 加配置文件 所以是以上的参考方式;
②我将命令返回的程序输出到中指定文件了-RedirectStandardOutput 参数指定的 具体可以看一下Start-Process命令的链接介绍;
③cmd的执行内容为:
D:\develop\frp\frpc.exe -c D:\develop\frp\frpc.ini
④将执行调起的pid输出到对应的文件里面
输出图片
2、检查执行与否以及终止程序
@echo off
rem 开启延迟扩展
setlocal enabledelayedexpansion
rem 获取程序名为example.exe的pid
for /f "tokens=2 delims=," %%a in ('tasklist /nh /fo csv /fi "imagename eq frpc.exe"') do (
rem 去掉双引号
set pid=%%~a
rem 打印pid
echo The pid of example.exe is [ !pid! ]
)
pause
taskkill /pid !pid!
检查停止脚本解释
①rem 开启延迟扩展 setlocal enabledelayedexpansion
②delims=xxx - 指分隔符集。这个替换了空格和制表符的默认分隔符集。
tokens=x - 指每行的第几个符号被传递到每个迭代
③pause 按任意键继续会进行停止操作 也可以去掉
④taskkill命令 停止命令
TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
描述:
使用该工具按照进程 ID (PID) 或映像名称终止任务。
参数列表:
/S system 指定要连接的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示
输入。
/FI filter 应用筛选器以选择一组任务。
允许使用 "*"。例如,映像名称 eq acme*
/PID processid 指定要终止的进程的 PID。
使用 TaskList 取得 PID。
/IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来
指定所有任务或映像名称。
/T 终止指定的进程和由它启用的子进程。
/F 指定强制终止进程。
/? 显示帮助消息。
筛选器:
筛选器名 有效运算符 有效值
----------- --------------- -------------------------
STATUS eq, ne RUNNING |
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号。
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 时,
mm - 分,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用量,单位为 KB
USERNAME eq, ne 用户名,格式为 [domain\]user
MODULES eq, ne DLL 名称
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
说明
----
1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
2) 远程进程总是要强行 (/F) 终止。
3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。
例如:
TASKKILL /IM notepad.exe
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM cmd.exe /T
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"