用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)共…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗
加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...
触发DMA传输错误中断问题排查
在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...
