Skip to content

bat脚本

环境变量设置

设置环境变量千万不要使用setx path=%path%;你的新路径 第一,setx存在参数的长度问题,如果path过长会有问题;第二,%path%会将你path中的变量转为实际值,如%JAVA_HOME%会转成实际路径,你肯定不想你的path中的路径全部变成实际路径,变量全部没有了。 不知道为什么网上有一堆答案是这个方案,真的是害人害己

首先第一步,获取到系统环境变量path的原本字符,这个通过

bat
wmic ENVIRONMENT where "name='path' and username='<system>'" get VariableValue | find ";"

可以获取到

在bat脚本中,我们希望将上面的获取赋值给一个变量,可以参考下面的代码

bat
wmic ENVIRONMENT where "name='path' and username='<system>'" get VariableValue | find ";" > system_env_temp.txt

for /f "tokens=*" %%a in (system_env_temp.txt) do (
    set "path_txt=%%a"
)

bat
for /f "tokens=*" %%i in ('wmic ENVIRONMENT where "name='path' and username='<system>'" get VariableValue ^| find ";"') do (
    set "path_txt=%%i"
)

这个有个坑,path_txt变量后面会有空格(不知道什么特殊字符,可能是制表符),如果把你要添加的路径,如E:\tools追加到path变量,如下代码,会发现环境变量的设置界面查看path看不到新增的路径,以文本方式查看能在末尾看到。这个问题待解决。

bat
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path_txt%;E:\tools;"

如果放置在前面的话暂时未发现异常

bat
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="E:\tools;%path_txt%"

bat文件执行弹出获取管理员权限的界面

方式一

bat
@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c ""%~s0"" ::","","runas",1)(window.close)&&exit

方式二

bat
@echo off

:: 检查是否以管理员权限运行
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo 请求管理员权限...
    PowerShell -Command "Start-Process '%~dpnx0' -Verb RunAs"
    exit /b
)

获取bat文件所在的绝对路径

bat
::WORKDIR即为bat文件绝对路径,以\结尾
set WORKDIR=%~dp0

bat根据端口查进程

bat
netstat -ano | findstr "xxxx"

注意:xxxx为端口号,需要替换为实际的端口号。打印示例:TCP 0.0.0.0:8888 0.0.0.0:0 LISTENING 29564 打印的最后一列就是进程号,然后根据进程号来查找哪个应用在监听该端口。

bat
tasklist | findstr "xxxx"

下面是一个bat示例,需要输入一个参数,即端口。可能会有重复打印,因为进程会监听ipv4和ipv6。

bat
@echo off
chcp 65001
setlocal EnableDelayedExpansion

:: 检查是否提供了端口号作为参数
if "%~1"=="" (
    echo 请提供端口号作为参数!
    exit /b
)

:: 设置端口号变量
set PORT=%~1

:: 使用 netstat 命令获取端口信息
:: 注意: netstat -ano 可以获取到 PID,而 PID 可以用于进一步查找程序名称
:: 过滤输出只保留感兴趣的行
for /f "tokens=5 delims= " %%i in ('netstat -ano ^| findstr %PORT% ^| findstr LISTENING') do (
    set PID=%%i
    :: 使用 tasklist 命令根据 PID 查找程序名称
	tasklist /FI "PID eq !PID!"
	wmic process where processid=!PID! get Caption,ExecutablePath,CommandLine,ProcessId,CreationDate,KernelModeTime,UserModeTime /format:value
)

endlocal

根据进程名查询占用端口

bat
tasklist | findstr "xxxx"

注意:xxxx为进程名,需要替换为实际的进程名,如nginx,打印示例: nginx.exe 28784 Console 1 9,952 K nginx.exe 29564 Console 1 10,112 K

如果有多条记录,逐一使用进程号试下。例如nginx,一般进程数>=2。

bat
netstat -ano | findstr "xxxx"

找到LISTENING的端口就是占用的端口。