用WHERE命令可以在命令行搜索文件
文章目录
- 用WHERE命令可以在命令行搜索文件
- 概述
- 笔记
- 没用的小程序
- END
用WHERE命令可以在命令行搜索文件
概述
想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?).
开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序.
后来翻到一个cmake.bat, 才发现, 人家使用WHERE命令直接来搜索一个程序是否存在.
看了一下WHERE命令的帮助, 功能真全啊.
WHERE命令默认是在当前目录和PATH环境变量中搜索, 也可以指定路径来搜索, 还支持通配符.
where命令在winxp中没有, 在win7/win10中都有这个命令
C:\Users\chenx>where /?WHERE [/R dir] [/Q] [/F] [/T] pattern...描述:显示符合搜索模式的文件位置。在默认情况下,搜索是在当前目录和 PATH环境变量指定的路径中执行的。参数列表:/R 从指定目录开始,递归性搜索并显示符合指定模式的文件。/Q 只返回退出代码,不显示匹配文件列表。(安静模式)匹配文件。(安静模式)/F 显示所有相配文件并用双引号括上。/T 显示所有相配文件的文件的文件。pattern 指定要匹配的文件的搜索模式。通配符 * 和 ? 可以用在模式中。也可以指定 "$env:pattern" 和 "path:pattern" 格式; 其中"env" 是环境变量,搜索是在 "env" 变量的指定的路径中执行的。这些格式不应该跟 /R 一起使用。此搜索也可以用将 PATHEXT 变量扩展名附加于此模式的方式完成。/? 显示此帮助消息。注意: 如果搜索成功,此工具返回错误级别 0; 如果不成功,返回 1; 如果失败或发生错误,返回 2。示例:WHERE /?WHERE myfilename1 myfile????.*WHERE $windir:*.*WHERE /R c:\windows *.exe *.dll *.batWHERE /Q ??.???WHERE "c:\windows;c:\windows\system32:*.dll"WHERE /F /T *.dll
笔记
没用的小程序
刚开始, 自己不知道, 写了一个小程序. 从PATH环境变量中搜索指定的程序是否存在.
比MS家提供的WHERE命令low太多了.
虽然做了一个没用的实验, 也留着以后看.
通过实验, 有以下收获.
- _access()支持带空格的路径
// getExePathNameFromEnvPath.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <map>typedef std::map<int, const char*> MAP_ENV;bool processEnvPath(const char* pszEnvPath, MAP_ENV& map_env, bool dispDebugInfo);
bool processPathValue(int sn, const char* pszPath, MAP_ENV& map_env, bool dispDebugInfo);
bool ReplaceEnv(const char* pszSrc, char*& pszDst, int& lenDst); // 需要调用者自己释放pszDst
bool IsFileExist(char* pszPathName);/*!
cmd line = THE_EXE cmake.exe cmake.cmd cmake.bat cmake.com
run result
[49] - error : %JAVA_HOME%\bin
find EXE from PATH [1] - C:\CMake\bin\cmake.exe
find EXE from PATH [2] - C:\Program Files (x86)\IncrediBuild\cmake.bat
*//*
正好翻到一个cmake.bat, 里面用where来检测cmake在哪里, win10中可用
where cmake
C:\CMake\bin\cmake.exe// 默认是在当前路径和%PATH%中查找, 可以带通配符
C:\Users\chenx>where cmake.*
C:\CMake\bin\cmake.exe
C:\Program Files (x86)\IncrediBuild\cmake.txt// 可以在指定目录下搜索指定的文件
WHERE /R c:\windows *.exe *.dll *.bat// where 命令帮助给出的例子WHERE myfilename1 myfile????.*WHERE $windir:*.*WHERE /R c:\windows *.exe *.dll *.batWHERE /Q ??.???WHERE "c:\windows;c:\windows\system32:*.dll"WHERE /F /T *.dll
*//*!
去winxp下看了一下, 并没有where这个命令
在win7/win10中都有这个命令
在win10中的位置如下:
C:\Users\chenx>where where*.*
C:\Windows\System32\where.exe
*/int main(int argc, char** argv)
{MAP_ENV map_env;MAP_ENV::iterator it;int i = 0;const char* pszEnvPath = ::getenv("PATH");char szBuf[_MAX_PATH];int iFindPos = 0;do {if (argc < 2){printf("function : to find argv[x]'s prog on %%PATH%%\n");printf("usage : THE_EXE prog_to_find1 prog_to_find2 ...\n");break;}// insert %path%'s value item to mapprocessEnvPath(pszEnvPath, map_env, false);// use map_envfor (i = 1; i < argc; i++){for (it = map_env.begin(); it != map_env.end(); it++){assert(NULL != it->second);memset(szBuf, 0, sizeof(szBuf));strcpy(szBuf, it->second);if (szBuf[strlen(szBuf) - 1] != '\\'){szBuf[strlen(szBuf)] = '\\';}strcat(szBuf, argv[i]);// find szBuf is exist?if (IsFileExist(szBuf)){printf("find EXE from PATH [%d] - %s\n", ++iFindPos, szBuf);}}}// free map_envfor (it = map_env.begin(); it != map_env.end(); it++){if (NULL != it->second){delete[] it->second;it->second = NULL;}}map_env.clear();} while (false);system("pause");
}bool IsFileExist(char* pszPathName)
{bool b_rc = false;// find EXE from PATH [2] - C:\Program Files (x86)\IncrediBuild\cmake.bat// _access 支持带空格的路径do {assert(NULL != pszPathName);if (0 != _access(pszPathName, 0)){break;}b_rc = true;} while (false);return b_rc;
}bool processEnvPath(const char* pszEnvPath, MAP_ENV& map_env, bool dispDebugInfo)
{bool b_rc = false;char* pszBuf = NULL;char* pszFind = NULL;char* pszFindRc = NULL;int len = 0;int i = 0;do {if (NULL == pszEnvPath){break;}len = (int)strlen(pszEnvPath);if (len <= 0){break;}pszBuf = new char[len + 1];pszBuf[len] = '\0';strcpy(pszBuf, pszEnvPath);pszFind = pszBuf;do {i++;// printf("i = %d\n", i);if (67 == i){i = i; // for debug}pszFindRc = strchr(pszFind, ';');if (NULL == pszFindRc){// 最后一个processPathValue(i, pszFind, map_env, dispDebugInfo);break;}else {pszFindRc[0] = 0x00;processPathValue(i, pszFind, map_env, dispDebugInfo);pszFindRc[0] = ';';if (0x00 == pszFindRc[1]){break;}pszFind = pszFindRc + 1;}} while (true);} while (false);if (NULL != pszBuf){delete[] pszBuf;pszBuf = NULL;}return b_rc;
}bool processPathValue(int sn, const char* pszPath, MAP_ENV& map_env, bool dispDebugInfo)
{bool b_rc = false;char* pszTmp = NULL;int lenTmp = 0;do {if (NULL == pszPath){break;}if (dispDebugInfo){printf("[%d] %s\n", sn, pszPath);}if (NULL == strchr(pszPath, '%')){// printf("[%2d] - %s\n", sn, pszPath);if (map_env.find(sn) == map_env.end()){pszTmp = new char[strlen(pszPath) + 1];strcpy(pszTmp, pszPath);map_env.insert(std::pair<int, const char*>(sn, pszTmp));}else {assert(false);}}else {// 有环境变量if (ReplaceEnv(pszPath, pszTmp, lenTmp)){// printf("[%2d] - %s\n", sn, pszPath);if (map_env.find(sn) == map_env.end()){map_env.insert(std::pair<int, const char*>(sn, pszTmp));}else {assert(false);}}else {printf("[%2d] - error : %s\n", sn, pszPath);}}b_rc = true;} while (false);assert(true == b_rc);return b_rc;
}bool ReplaceEnv(const char* pszSrc, char*& pszDst, int& lenDst)
{bool b_rc = false;const char* pszCur = NULL;int iPosDst = 0;bool bFindEnvBegin = false;bool bFindEnvEnd = false;char szEnv[_MAX_PATH];int iPosEnv = 0;char* pszEnvValue = NULL;pszDst = NULL;lenDst = 0;do {if ((NULL == pszSrc) || (strlen(pszSrc) <= 0)){break;}pszDst = new char[_MAX_PATH];lenDst = _MAX_PATH;pszCur = pszSrc;while (0x00 != pszCur[0]){if (!bFindEnvBegin){if (pszCur[0] != '%'){pszDst[iPosDst++] = pszCur[0];}else {bFindEnvBegin = true;memset(szEnv, 0, sizeof(szEnv));pszCur++;continue;}}else if (bFindEnvBegin && !bFindEnvEnd){if (pszCur[0] != '%'){szEnv[iPosEnv++] = pszCur[0];}else {bFindEnvEnd = true;// get %szEnv% value pEnvpszEnvValue = getenv(szEnv);if (NULL == pszEnvValue){goto END;}// append pEnv to pszDststrcpy(pszDst, szEnv);}}pszCur++;}b_rc = true;} while (false);END:if (!b_rc){if (NULL != pszDst){delete[] pszDst;pszDst = NULL;}lenDst = 0;}return b_rc;
}
END
相关文章:
用WHERE命令可以在命令行搜索文件
文章目录 用WHERE命令可以在命令行搜索文件概述笔记没用的小程序END 用WHERE命令可以在命令行搜索文件 概述 想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?). 开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序. 后…...
持续交付/持续部署流水线介绍(CD)
目录 一、概述 二、典型操作流程 2.1 CI/CD典型操作流 2.2 CI/CD操作流程说明 2.3 总结 三、基于GitHubDocker的持续交付/持续部署流水线(公有云) 3.1 基于GitHubDocker的持续交付/持续部署操作流程示意图 3.2 GitHubDocker持续交付/持续部署流水…...
第四百三十八回
文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 们在上一章回中介绍了"不同平台上换行的问题"相关的内容,本章回中将介绍如何在页面上显示蒙板层.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们…...
Python学习:面相对象
面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…...
SSM学习——Spring AOP与AspectJ
Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming,即面向切面编程。 想象你是汉堡店的厨师,每一份汉堡都有好几层,这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡,如果按照传统的方…...
Android 使用LeakCanary检测内存泄漏,分析原因
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时,少量的内存泄漏我们是发现不了的,但是当内存泄漏达到一定数量时&…...
Linux部署Kafka2.8.1
安装Jdk 首先确保你的机器上安装了Jdk,Kafka需要Java运行环境,低版本的Kafka还需要Zookeeper,我此次要安装的Kafka版本为2.8.1,已经内置了一个Zookeeper环境,所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…...
【pytest、playwright】allure报告生成视频和图片
目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下: # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…...
浅谈iOS开发中的自动引用计数ARC
1.ARC是什么 我们知道,在C语言中,创建对象时必须手动分配和释放适量的内存。然而,在 Swift 中,当不再需要类实例时,ARC 会自动释放这些实例的内存。 Swift 使用 ARC 来跟踪和管理应用程序的内存,其主要是由…...
Spring IoCDI(2)
IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…...
30. UE5 RPG GamplayAbility的配置项
在上一篇文章,我们介绍了如何将GA应用到角色身上的,接下来这篇文章,将主要介绍一下GA的相关配置项。 在这之前,再多一嘴,你要能激活技能,首先要先应用到ASC上面,才能够被激活。 标签 之前介绍…...
提升自己最快的方式是什么?
提升自己最快的方式通常涉及到个人成长的各个方面,包括心理、情感、技能和知识等。根据查阅到的资料,以下是一些具体的方法和步骤,帮助你快速提升自己: 1. 培养屏蔽力 荷兰畅销书作家罗伊马丁纳提到,屏蔽力是个人成长…...
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence…...
《HelloGitHub》第 96 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …...
C++tuple类型
tuple 类型 tuple是类似pair的模板。 每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。 每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可…...
亚远景科技-浅谈ASPICE标准和ASPICE认证/评估
ASPICE(Automotive SPICE)是一种针对汽车行业的软件开发过程的评估模型,它旨在帮助汽车制造商和供应商提高软件开发过程的能力和质量,从而提升产品的质量、安全性和效率。 ASPICE标准涵盖了软件开发的各个阶段和活动,…...
PHP性能提升方案
一、背景与介绍 PHP语言开发效率高,特别应用于适合中小型项目,对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性,针对项目要适应高并发、高流量的访问特性,PHP确实在性能方面相对Go、J…...
关系(二)利用python绘制热图
关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…...
P8597 [蓝桥杯 2013 省 B] 翻硬币
# [蓝桥杯 2013 省 B] 翻硬币 ## 题目背景 小明正在玩一个“翻硬币”的游戏。 ## 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo&#x…...
主流公链 - Fantom
Fantom:高性能的区块链协议 Fantom是一种开创性的区块链协议,旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议:Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错(ABFT)共…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
