标题: [文件操作] 批处理如何获取子目录下exe的绝对路径并替换\为\\再替换到文本的特定位置? [打印本页]
作者: 867258173 时间: 2016-11-6 14:51 标题: 批处理如何获取子目录下exe的绝对路径并替换\为\\再替换到文本的特定位置?
最近使用sublime text3打代码,因为目前正在学习前端html5+css3+javescript+jqueru,这款编辑器可以说对我帮助很大
但每次测试兼容,需要切换不同浏览器,都要去改路径,太花时间。因情况我需要经常换电脑,别人下这些浏览器我还不知道,就算下了,路径可能又不同。我还得再去改。
我希望能把sublime text3装在U盘作为便携版使用
调用八大主流浏览器,还有些有名气浏览器来进行测试
sublime text3默认修改浏览器文件在- 主目录\Data\Packages\User\SideBarEnhancements\Open With
复制代码
- {
- "caption": "这里是浏览器名",
- "id": "side-bar-files-open-with-seamonkey",
-
- "command": "side_bar_files_open_with",
- "args": {
- "paths": [],
- "application": "这里是浏览器路径,但必须是//双符号才行", // WINNT
- "extensions":"", //open all even folders
- "args":[]
- },
- "open_automatically" : false // will close the view/tab and launch the application
- },,
复制代码
打开【Side Bar.sublime-menu】文件后,caption后是文件名,而【application】后就是路径
我目前想在父目录下创建个【浏览器名称】
比如\浏览器\chrome谷歌浏览器\chrome.exe
\浏览器\firefox火狐浏览器\firefox.exe
......
子目录的2级文件夹名就是caption后浏览器名,输入到【caption】后【""】里,而绝对路径先替换\到\\。再输入到【application】后【""】
不知能否使用bat来实现呢?目前还没学javescript,对循环函数方面还是不太了解,只能等今后再学习了。
现在特别需要能够放在U盘使用sublime text3的浏览器打开,不知大家能否实现这个功能?
我觉得实现这功能需要用到循环会比较多,进行判断再输入。最后保存
已把设置文件发到附件,大家可以参考,需要sublime text3回复下,我直接发一下作为参考,这款各种快捷键特别方便,各种插件。可能用来写bat,支持高亮和符号补全。在类型选【batch File】
作者: pcl_test 时间: 2016-11-6 16:50
描述很长但我没看明白
举个栗子- for /f "delims=" %%a in ('dir /a-d/b/s *.exe') do set f=%%a&call echo;%%f:\=\\%%
- pause
复制代码
另外,难道不支持相对路径
作者: 867258173 时间: 2016-11-6 16:54
本帖最后由 867258173 于 2016-11-6 17:14 编辑
回复 2# pcl_test
对,要是支持相对路径,我可以像bat加个%CD%就能解决。然而sublime这款编辑器,调用的文件不支持相对路径,路径还是\\,这点和注册表有些像。
但不同点,其中需要的逻辑思维就多了些
1.要判断多个不同exe路径在子目录下路径名
比如在bat文件夹下,\浏览器\定义名称\浏览器名称.exe
2.判断完后需要再进行两次判断。一就是目录下第二层文件名,也就是【定义名称】输入到【caption】后【""】里的路径,比如- "caption": "谷歌浏览器,这是可以自定义的",
复制代码
二就是最重要的路径名- "application": "E:\\编程\\Sublime Text Build 3103\\浏览器\\Google Chrome\\chrome.exe", // WINNT
复制代码
这样就是完整的输入结果
3.要输入的对象没有后缀,视情况需要给文件添txt后缀,修改完再删除后缀进行保存
只是单纯输出路径结果或到txt文档,这我还是明白点,但要是这么多条件组合起来,我就不知道怎么写bat。
作者: CommandBatCmd 时间: 2016-11-6 23:06
- @echo off&Title 获取程序所在的目录名&setlocal EnableExtensions
- cd /d "%~dp0"
- for /f "delims=" %%I in ('DIR /S /B /A:-D *.exe') do set "ExePath=%%~I"&call :args
- Endlocal&pause&exit
-
- :args
- SET "caption=%ExePath:\=" "%
- for %%I in ("%caption%) do SET "caption=%%~I"
- set "application=%ExePath:\=\\%"
- ECHO,%caption%
- ECHO,%application%
- ECHO,请把以上两个参数替换到对应的地方即可。&ECHO,&ECHO,
- goto :eof
复制代码
作者: pcl_test 时间: 2016-11-6 23:54
保存为bat运行- /*&cls
- @echo off
- (for /f "delims=" %%a in ('dir /a-d/b/s *.exe') do @echo;%%a)|cscript -nologo -e:jscript "%~f0"
- pause&exit
- */
-
- var fso=new ActiveXObject('Scripting.FileSystemObject');
- var text=fso.OpenTextFile(WSH.ScriptFullName, 1).ReadAll();
- var files=WSH.StdIn.ReadAll().split(/[\r\n]+/);
- WSH.Echo(text.match(/\/\*[\s\S]+?\*\//g)[1].replace(
- /\/\*(\[[\s\S]+?\[)(\s+?\{[\s\S]+\})(\s+?\][\s\S]+?\])\*\//,
- function(a,b,c,d){
- var t=[];
- for(var i=0;i<files.length;i++){
- var s=c.replace(/程序名/, files[i].replace(/.+\\([^\\]+)\\[^\\]+$/,'$1'));
- var s=s.replace(/程序路径/, files[i].replace(/\\/g,'\\\\'));
- t.push(s);
- }
- return b+t.join(',\r\n')+d;
- }
- ))
-
- /*[
- {"id": "side-bar-files-open-with",
- "children":
- [
- {
- "caption": "程序名",
- "id": "side-bar-files-open-with-seamonkey",
-
- "command": "side_bar_files_open_with",
- "args": {
- "paths": [],
- "application": "程序路径", // WINNT
- "extensions":"", //open all even folders
- "args":[]
- },
- "open_automatically" : false // will close the view/tab and launch the application
- }
- ]
- }
- ]*/
复制代码
作者: 867258173 时间: 2016-11-7 01:07
本帖最后由 867258173 于 2016-11-7 01:14 编辑
回复 4# CommandBatCmd
回复 5# pcl_test
这么晚了,辛苦两位了。
目前只在cmd里显示了\\完整路径,但还没实现最终目标。
没进行到输出结果到【bat所在目录\Data\Packages\User\SideBarEnhancements\Open With\Side Bar.sublime-menu】这个没后缀的文件内。
另外for的*.exe可以不用加这个条件,一般是要得到目录下所有exe路径名需要*,但既然已经知道要定义的exe名称是什么,就可以,直接写程序名就好,这样反而节省了for的时间- (for /f "delims=" %%a in ('dir /a-d/b/s chrome.exe') do @echo;%%a)|cscript -nologo -e:jscript
-
- "%~f0"
-
-
- (for /f "delims=" %%a in ('dir /a-d/b/s firefox.exe') do @echo;%%a)|cscript -nologo
-
- -e:jscript "%~f0"
-
-
- (for /f "delims=" %%a in ('dir /a-d/b/s 世界之窗深度单文件版.exe') do @echo;%%a)|cscript -nologo
-
- -e:jscript "%~f0"
-
- ......
复制代码
步骤感觉已经完成了一半。再加上以上自定义的程序名,限定了程序的路径。就差直接输出到【Side Bar.sublime-menu】这个没后缀的文档内
另外1楼我发的附件里文件里,不用在意【caption】和【application】""的内容,直接全部删掉测试就好,毕竟定义输出到空的元素内,总比替换元素本身内容要容易一些。
作者: codegay 时间: 2016-11-7 02:12
用反斜杠就好了。
作者: 867258173 时间: 2016-11-7 09:54
本帖最后由 867258173 于 2016-11-7 09:56 编辑
回复 7# codegay
还真可以, 现在想起来CSS的路径也得使用/下划线,但虽然知道限定条件减少了,关键的输出到文件还是没有一点解决方法,因为输出对象本身没后缀,也无法直接定义后缀搜索。格式是JSON、是搜索后新建个txt替换内容,还是直接先把对象本身加个txt再进行输入,其实只要能完成最终效果,过程多个步骤也没事
作者: CommandBatCmd 时间: 2016-11-7 11:53
- @echo off&Title 完整测试代码&setlocal EnableExtensions
-
- :::::::::::::::::::::::::::::::::::::::::::
- (FOR %%I IN (Z Y X W V U T S R Q P O N M L K J I H G F E D C) DO IF EXIST "%%I:\" set "RootDir=%%I:")&call :CreateDir&@rem 此条测试使用。
- if not exist ".\Data\Packages\User\SideBarEnhancements\Open With" md ".\Data\Packages\User\SideBarEnhancements\Open With"
- SET "FilePath=.\Data\Packages\User\SideBarEnhancements\Open With\Side Bar.sublime-menu"
- .>"%FilePath%" 2>nul&@rem 清空文件Side Bar.sublime-menu的内容,如果需要就备份。
- call :head
-
- %Core% SET "Program=chrome.exe firefox.exe SogouExplorer.exe"&@rem 定义的exe文件名要避免cmd命令行上的特殊字符;除此以外程序对已存在的路径中的特殊字符不敏感。
- %Core% FOR %%I IN (%Program%) DO for /f "delims=" %%J in ('DIR /S /B /A:-D "%%~I"') do if /I "%%~nxJ"=="%%~I" (set "ExePath=%%~J"&call set "application=%%ExePath:\=\\%%"&call :args&call :Build)
- call :end
-
- notepad "%FilePath%"&rd /s /q "%RootDir%\%TestDir%" 2>NUL&@rem 此条测试使用。
- Endlocal&exit
-
- @rem 获取程序所在的目录名称。
- :args
- %Core% SET "caption=%ExePath:\=" "%
- %Core% for %%I in ("%caption%) do SET "caption=%%~I"
- goto :eof
- :::::::::::::::::::::::::::::::::::::::::::
-
- @rem 文件中间的可变部分。
- :Build
- set /p"= {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p= "caption": "%caption%",<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "id": "side-bar-files-open-with-seamonkey","<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "command": "side_bar_files_open_with","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args": {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "paths": [],"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p= "application": "%application%", // WINNT<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "extensions":"", //open all even folders"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args":[]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "open_automatically" : false // will close the view/tab and launch the application"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
-
- @rem 文件的固定尾部。
- :end
- set /p"= {"caption":"-"}"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= ]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= }"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"=]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
-
- @rem 文件的固定头部。
- :head
- set /p"=["<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= {"id": "side-bar-files-open-with","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "children":"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= ["<nul>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
-
- @rem 模拟附件“Side Bar.sublime-menu”中的文件路径,测试使用。
- :CreateDir
- FOR /F "delims=" %%I IN ('DIR /B /A:D "%RootDir%\"') DO for /F "eol= skip=5 tokens=1 delims=" %%J in ('dir "%RootDir%\%%~I" /w /a') do if "%%J"=="[.] [..] " (SET "DirExist=%%~I")
- :loop
- set TestDir=%RANDOM%
- IF "%DirExist%"=="" (if exist "%RootDir%\%TestDir%\" (goto :loop) else (md "%RootDir%\%TestDir%")) else (set "TestDir=%DirExist%")
- cd /d %RootDir%\%TestDir%
-
- md "%RootDir%\%TestDir%\360安全浏览器\360se7.0.0.180"
- md "%RootDir%\%TestDir%\Google【谷歌浏览器 (Google Chrome) 35.0.1916.114 绿色免安装版+便携版 - 精品绿色便携软件】Chrome_35.0.1916.114_PortableSoft\GoogleChromePortable\App\Google Chrome"
- md "%RootDir%\%TestDir%\OperaNextPortable"
- md "%RootDir%\%TestDir%\pcxFirefox-46.0-zhCN-vc2013-x86-sse2-betterpgo-160430\firefox"
- md "%RootDir%\%TestDir%\SafariPortable"
- md "%RootDir%\%TestDir%\SogouExplorer"
- md "%RootDir%\%TestDir%\傲游浏览器\111\Bin"
- md "%RootDir%\%TestDir%\桌面\1\浏览器类\IETester v0.5.2"
-
- 2>nul .>"%RootDir%\%TestDir%\360安全浏览器\360se7.0.0.180\360se.exe"
- 2>nul .>"%RootDir%\%TestDir%\Google【谷歌浏览器 (Google Chrome) 35.0.1916.114 绿色免安装版+便携版 - 精品绿色便携软件】Chrome_35.0.1916.114_PortableSoft\GoogleChromePortable\App\Google Chrome\chrome.exe"
- 2>nul .>"%RootDir%\%TestDir%\OperaNextPortable\launcher.exe"
- 2>nul .>"%RootDir%\%TestDir%\pcxFirefox-46.0-zhCN-vc2013-x86-sse2-betterpgo-160430\firefox\firefox.exe"
- 2>nul .>"%RootDir%\%TestDir%\SafariPortable\SafariPortable.exe"
- 2>nul .>"%RootDir%\%TestDir%\SogouExplorer\SogouExplorer.exe"
- 2>nul .>"%RootDir%\%TestDir%\傲游浏览器\111\Bin\Maxthon.exe"
- 2>nul .>"%RootDir%\%TestDir%\桌面\1\浏览器类\IETester v0.5.2\IETester.exe"
- 2>nul .>"%RootDir%\%TestDir%\桌面\1\浏览器类\LisectIE6.exe"
- 2>nul .>"%RootDir%\%TestDir%\桌面\1\浏览器类\世界之窗深度单文件版.exe"
- goto :eof
- :::::::::::::::::::::::::::::::::::::::::::
复制代码
1. 纯bat代码,没有什么技术含量,但可以解决附件中两处参数自定义的问题;放到任何路径下,运行测试后,生成附件“Side Bar.sublime-menu”的内容。
2. 实际使用时,去掉三处测试命令;假如自定义的浏览器目录为“E:\新建文件夹\浏览器\",把此批处理放到“E:\新建文件夹\”下运行即可。
3. 上面这么长的内容,实际只有标记【%Core%】的四处是核心,其余的都不怎么关联主题。
作者: 867258173 时间: 2016-11-7 15:05
回复 9# CommandBatCmd
感谢,这次是可以输出了
但经过测试又有两个问题出现
1.编码问题,默认ANSI,导致编辑器打开乱码,需要设置UTF-8编码才行
2.代码输出有些错误,这是输入的错误图
这是示范简单设置图
这是我目前设置全部浏览器设置图,可能有些多,打算之后把统一整理到【浏览器】文件夹下。
我把目前写好的完整浏览器文件发一下吧,在附件里
sublime编辑器也发一下,也方便你可以用来测试
http://pan.lanzou.com/x/720393
这是从sublime编辑器查看【Side Bar.sublime-menu】设置文件方法
作者: CommandBatCmd 时间: 2016-11-8 13:38
回复 10# 867258173
以下代码本质没改变,只是稍稍修改了原来的代码。- @echo off&Title 生成Side Bar.sublime-menu的内容&setlocal EnableExtensions
- if not exist ".\Data\Packages\User\SideBarEnhancements\Open With" md ".\Data\Packages\User\SideBarEnhancements\Open With"
- SET "FilePath=.\Data\Packages\User\SideBarEnhancements\Open With\Side Bar.sublime-menu"
- if exist "%FilePath%" if not exist "%FilePath%.bak" copy /y "%FilePath%" "%FilePath%.bak" >nul
- .>"%FilePath%" 2>nul&call :head
- SET "Program=chrome.exe firefox.exe launcher.exe SafariPortable.exe Maxthon.exe TheWorld.exe 360se.exe 360chrome.exe baidubrowser.exe QQBrowser.exe SogouExplorer.exe LisectIE6.exe IETester.exe navigator.exe"
- FOR %%I IN (%Program%) DO for /f "delims=" %%J in ('DIR /S /B /A:-D "%%~I" 2^>nul') do if /I "%%~nxJ"=="%%~I" (set "ExePath=%%~J"&call set "application=%%ExePath:\=/%%"&SET "caption=%%~I"&call :Build)
- call :end
- (iconv.exe --help >NUL 2>nul)&&(for /f "usebackq" %%I in (`SET /P^="测试"^<NUL^|iconv.exe -f GB2312 -t java`) do if "%%I"=="\u6d4b\u8bd5" ((iconv.exe -f GBK -t UTF-8 "%FilePath%" > "%FilePath%.tmp")&(type "%FilePath%.tmp">"%FilePath%")&(del /f/q "%FilePath%.tmp")))
- notepad "%FilePath%"&Endlocal&exit
-
- :Build
- set /p= // This is [%caption%]<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p= "caption": "%caption%",<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "id": "side-bar-files-open-with-seamonkey","<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "command": "side_bar_files_open_with","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args": {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "paths": [],"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p= "application": "%application%", // WINNT<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "extensions":"", //open all even folders"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args":[]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "open_automatically" : false // will close the view/tab and launch the application"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
-
- :end
- set /p"= {"caption":"-"}"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= ]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= }"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"=]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
-
- :head
- set /p"=["<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= {"id": "side-bar-files-open-with","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "children":"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= ["<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= //application 1"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "caption": "Photoshop","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "id": "side-bar-files-open-with-photoshop","<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "command": "side_bar_files_open_with","<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args": {"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "paths": [],"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "application": "Adobe Photoshop CS5.app", // OSX"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "extensions":"psd^|png^|jpg^|jpeg", //any file with these extensions"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "args":[]"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= "open_automatically" : false // will close the view/tab and launch the application"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= },"<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= //separator"<nul>>"%FilePath%"&echo,>>"%FilePath%"
- set /p"= {"caption":"-"},"<nul>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"&echo,>>"%FilePath%"
- goto :eof
- :::::::::::::::::::::::::::::::::::::::::::
复制代码
说明:
1. 生成的编码为ANSI,全英文路径文件名直接支持UTF-8环境;
2. 生成的换行方式为CR+LF(Windows),要使用LF(Unix),修改:sublime编辑器》查看》行尾》Unix;
3. 生成的路径分隔符为”/“,要使用“\\”,修改程序中的 "application=%%ExePath:\=/%%" 为 "application=%%ExePath:\=\\%%";
4. 已定义14个浏览器,可以根据需要手动直接修改程序中“SET Program=”后的赋值;
5. 本程序放到目录“Data”的同级运行。
手动更改ANSI编码为UTF-8编码:
sublime编辑器》打开文件》Side Bar.sublime-menu;
文件》设置文件编码》UTF-8;
文件》保存编码》UTF-8;
标签页》Side Bar.sublime-menu》关闭;
文件》打开最近的文件》Side Bar.sublime-menu。
每次这样很麻烦!把iconv.exe放到本程序一起即可(iconv.exe是知名的iconv库在windows下的命令行编码转换工具,谷歌百度一大把)。
以上是实际使用时的完整代码,在XP上测试通过,你可试试,祝你好运!
:::::::::::::::::::::::::::::::::::::::::::
作者: pcl_test 时间: 2016-11-8 20:56
- @echo off
- rem win7及以上系统运行
- dir /a-d/b/s *.exe|powershell -c "$t='';[IO.File]::ReadAllText('%~f0', [Text.Encoding]::Default) -match '(?<=pause&exit\r\n)(\[[\s\S]+?\[)(\s+?\{[\s\S]+\})(\s+?\{[\s\S]+?\][\s\S]+?\])'|out-null;$input|%%{$t+=(($matches[2] -replace 'fname',($_.split('\')[-2])) -replace 'fpath',($_ -replace '\\','\\'))+\",`n\"};($matches[1]+$t+$matches[3]) -replace '\r',''|out-file '$result.txt' -encoding utf8"
- pause&exit
- [
- {"id": "side-bar-files-open-with",
- "children":
- [
- {
- "caption": "fname",
- "id": "side-bar-files-open-with-seamonkey",
-
- "command": "side_bar_files_open_with",
- "args": {
- "paths": [],
- "application": "fpath", // WINNT
- "extensions":"", //open all even folders
- "args":[]
- },
- "open_automatically" : false // will close the view/tab and launch the application
- }
- {"caption":"-"}
- ]
- }
- ]
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |