Board logo

标题: [文件操作] 请教批处理如何限制文件扩展名? [打印本页]

作者: y6383289    时间: 2023-5-11 20:46     标题: 请教批处理如何限制文件扩展名?

  1. @ECHO OFF
  2. setlocal enabledelayedexpansion
  3. call :File_Input "files" "输入文件"&& echo 输入文件=!输入文件!
  4. echo Files=%files%
  5. echo 调试结束&&pause&&exit
  6. goto :eof
  7. ::**************************************************************
  8. ::       输入文件名称
  9. ::**************************************************************
  10. :File_Input
  11. Title ★★★★★ %~n0 %~2 ★★★★★
  12. if "%2" NEQ "" set %~2=No
  13. for /f "delims=" %%a in ('mshta "about:<input type=file id=file><script>file.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(file.value);close();</script>"') do set %~1="%%a"
  14. if "%~1" NEQ "" if "%2" NEQ "" set %~2=Yes
  15. Title ★★★★★ %~n0  ★★★★★
  16. goto :eof
复制代码

作者: czjt1234    时间: 2023-5-14 15:05

好象有个com对象可以限制的扩展名的,但是记不得了

要不你检查扩展名不对就返回重新选择,循环
作者: y6383289    时间: 2023-5-14 16:21

不限制文件类型,可选文件件多了体验不好。懒
作者: jyswjjgdwtdtj    时间: 2023-5-14 16:44

本帖最后由 jyswjjgdwtdtj 于 2023-5-14 16:51 编辑

方案1
用回2000或xp 有系统自带的com组件
方案2
用vbs调用vba(极其复杂)
方案3
在js里加判断循环
方案5
用vbs调用ie
  1. <input type=file accept=".xls"/>
复制代码
方案4
用ps .net库里没有我倒立吃屎
总之不用bat咋都方便
作者: czjt1234    时间: 2023-5-15 09:40

  1. Set objDialog = CreateObject("SAFRCFileDlg.FileSave")
  2. objDialog.FileName = "test"
  3. objDialog.FileType = ".txt"
复制代码
  1. Set objDialog = CreateObject("UserAccounts.CommonDialog")
  2. objDialog.Filter = "VBS File|*.vbs"
复制代码
找了2个com对象,可惜在win7x64中均测试失败
作者: y6383289    时间: 2023-6-2 16:23

只会点批处理,别的不会,
作者: jyswjjgdwtdtj    时间: 2023-6-2 18:04

本帖最后由 jyswjjgdwtdtj 于 2023-6-3 13:14 编辑

嗯 突然想起来之前做过一个
  1. //jscript or javascript
  2. //ie
  3. function getvbsfilepath(){
  4. return new ActiveXObject("excel.application").GetOpenFileName("VBScript Files (*.vbs *.vbe),*.vbs;*.vbe",1,"打开VBScript脚本文件")
  5. }
  6. function savevbsfilepath(filename){
  7. return new ActiveXObject("excel.application").GetSaveAsFilename(filename,"VBScript Files (*.vbs *.vbe),*.vbs;*.vbe",1,"另存为VBScript脚本文件")
  8. }
复制代码
调用excel的原生方法 即vba里的application对象
所以不用安装vba 有wps或office就行
  1. @ECHO OFF
  2. setlocal enabledelayedexpansion
  3. call :File_Input "files" "输入文件"&& echo 输入文件=!输入文件!
  4. echo Files=%files%
  5. echo 调试结束&&pause&&exit
  6. goto :eof
  7. ::**************************************************************
  8. ::       输入文件名称
  9. ::**************************************************************
  10. :File_Input
  11. Title ★★★★★ %~n0 %~2 ★★★★★
  12. if "%2" NEQ "" set %~2=No
  13. for /f "delims=" %%a in ('mshta "about:<script>new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(new ActiveXObject('excel.application').GetOpenFileName('VBScript Files (*.vbs *.vbe),*.vbs;*.vbe',1,'打开VBScript脚本文件'));close();</script>"') do set %~1="%%a"
  14. if "%~1" NEQ "" if "%2" NEQ "" set %~2=Yes
  15. Title ★★★★★ %~n0  ★★★★★
  16. goto :eof
复制代码

作者: y6383289    时间: 2023-6-3 23:26

非常感谢,代码可用。但有点美中不足,文件选择窗口在批处理下面,能设置到最前面吗?
作者: jyswjjgdwtdtj    时间: 2023-6-4 07:54

回复 8# y6383289


    我这里不会呀 不过之前也遇到这个问题 不知道怎么解决
作者: czjt1234    时间: 2023-6-4 08:44

试试那个修改cmd窗口大小和位置的啥命令的,mode还是啥的
作者: aloha20200628    时间: 2023-6-5 14:13


如果mshta脚本采用ie10+引擎新增的html5功能,即可令用户品尝到‘文件类型筛选’和‘文件多选’等诸多美餐...
以下代码中显式指定ie10引擎版本,否则mshta默认采用ie7。input标签中的属性multiple和accept分别对应‘文件多选’和‘文件类型’两个选项,如要文件单选,删除multiple即可。
  1. <!-- :
  2. @echo off
  3. for /f "delims=" %%F in ('mshta "%~f0" ') do (echo,%%F)
  4. pause&exit/b
  5. -->
  6. <meta http-equiv="x-ua-compatible" content="ie=10">
  7. <input type=file id=f multiple accept=".txt,.bat,.cmd,.hta,.js,.vbs">
  8. <script>
  9.    f.click();
  10.    new ActiveXObject('scripting.filesystemobject').getstandardstream(1).write(f.value ? f.value : '');
  11.    close();
  12. </script>
复制代码

作者: y6383289    时间: 2023-6-10 00:45

mode 改变窗口大小
作者: y6383289    时间: 2023-6-10 00:48

能否改为调用形式?
作者: y6383289    时间: 2023-6-10 00:48

如果mshta脚本采用ie10+引擎新增的html5功能,即可令用户品尝到‘文件类型筛选’和‘文件多选’等诸多美餐 ...
aloha20200628 发表于 2023-6-5 14:13

能否改为调用形式
作者: y6383289    时间: 2023-6-10 00:49

试试那个修改cmd窗口大小和位置的啥命令的,mode还是啥的
czjt1234 发表于 2023-6-4 08:44




mode 改变窗口大小
作者: aloha20200628    时间: 2023-6-10 19:20


给LZ的几点说明》
一。这是一个纯P与mshta代码混编的脚本,用扩展名.cmd或.bat存盘后使用。
二。文件编码选择系统默认的简中编码,如用记事本存盘则选择 ANSI 即可。
三。本贴11楼第3行代码就是在 for...in() 循环条件表达式中调用mshta脚本,实现从文件资源管理器中选择文件并获取其选择结果-即循环变量%%F。
四。设置文件选择类型,请修改第7行中的属性值 accept=".txt,.bat,.cmd,.hta,.js,.vbs"。
五。可在第2行和第4行之间加入使用者自己所需的纯P代码。

作者: y6383289    时间: 2023-6-10 21:25

本帖最后由 y6383289 于 2023-6-10 21:31 编辑
给LZ的几点说明》
一。这是一个纯P与mshta代码混编的脚本,用扩展名.cmd或.bat存盘后使用。
二。文件编 ...
aloha20200628 发表于 2023-6-10 19:20



    对mshta代码了解不多。可否帮忙改为调用形式?非常感谢!!!

@ECHO OFF
setlocal enabledelayedexpansion
call :File_Input "files" "输入文件"&& echo 输入文件=!输入文件!
echo Files=%files%
echo 调试结束&&pause&&exit


goto :eof

::**************************************************************
::       输入文件名称
::**************************************************************
:File_Input
Title ★★★★★ %~n0 %~2 ★★★★★
if "%2" NEQ "" set %~2=No


代码区

set %~1=路径及文件


if "%~1" NEQ "" if "%2" NEQ "" set %~2=Yes
Title ★★★★★ %~n0  ★★★★★
goto :eof
作者: jyswjjgdwtdtj    时间: 2023-6-10 22:14

本帖最后由 jyswjjgdwtdtj 于 2023-6-10 22:22 编辑

再给你个最好的(或许吧) 你可以改成保存文件对话框
  1. <script>window.resizeTo(0,0);window.onload=function(){try{new ActiveXObject('scripting.filesystemobject').GetStandardStream(1).Write(document.getElementById('hdh').object.openfiledlg('','','Text Files (*.txt)|*.txt|','select files'))}catch(err){};window.close()}</script><hta:application caption=no showintaskbar=no /><object id=hdh classid=CLSID:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object>
复制代码
在hta里能成功执行而且不会报错窗口一定能关的上




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2