我想要做什么:使用dir命令来查找一堆文本文件,然后用Notepad ++打开它们。 最好在一个命令中不创build额外的文件。 通常情况下,你可以说
notepad++ zed.txt ./ted/zed.txt ./red/zed.txt
但是我需要在一个复杂的目录结构中打开很多文件。
我觉得我应该可以做这样的事情:
dir /s/a/b "zed.txt" | notepad++
这确实给了我想要的输出(recursion地发现文件和吐出只是文件名),但每个在自己的行和记事本++不打开它们,它只是打开,并要求创build文件“记事本++” – 这是空的。
即使使用一个额外的文件(不受欢迎的,但不是最好的)不起作用:
c:\Users\jstange\Desktop\helios_c2_unclass>dir /s/a/b "cmakelists.txt" > np.txt && notepad < np.txt
要么
dir /s/a/b "cmakelists.txt" > np.txt notepad++ < np.txt
记事本++目录是我的path。
很明显,我的重新定向技能不好。 非常感谢帮助。
for /f "delims=" %a IN ('dir /ad /b /s *.csv') do call notepad++ "%a"
这似乎为我工作。 当然,你将需要修改你的'dir / b'标准为任何你想要匹配的文件。
这个命令遍历所有由dir输出的文件(在我的情况下只有csv文件),并用notepad ++打开它们。 请确保在您的dir命令之后包含/ b,以仅输出文件名而不包含所有其他信息。
这在我的命令行中起作用:
(for /F "delims=" %a in ('dir /s/a/b "zed.txt") do call set "list=%list% "%a"") & call notepad++ %list%
只要确保在执行此行之前list
变量不存在。
记事本++是一个GUI应用程序,它不会从标准输入流STDIN中逐行读取文件名,而是将路径中没有双引号的文件名重定向到记事本++ 。
Notepad ++需要以(双引号)文件名的空格分隔列表作为命令行参数,因此根据文字中的字符,不需要路径,相对路径或绝对路径的文件名周围的双引号文件名和文件路径。
我的第一个建议是:
@echo off setlocal EnableExtensions EnableDelayedExpansion set "Files=" for /F "delims=" %%I in ('dir zed.txt /AD /B /S 2^>nul') do set "Files=!Files! "%%I"" if not "!Files!" == "" notepad++.exe%Files% endlocal
此批处理代码将找到的文件连接到一个始终以空格开始的长参数列表,并使用该列表启动Notepad ++ 。
这个简单的代码的问题是,如果真的有很多文件名为zed.txt
文件,参数列表的长度可能会超过环境变量字符串的最大长度。
一个简单的解决方案是将每个Notepad ++运行的文件数量限制为25。
@echo off setlocal EnableExtensions EnableDelayedExpansion set "Files=" set "FileCount=0" for /F "delims=" %%I in ('dir zed.txt /AD /B /S 2^>nul') do ( set "Files=!Files! "%%I"" set /A FileCount+=1 if !FileCount! == 25 ( notepad++.exe!Files! set "Files=" set "FileCount=0" ) ) if not %FileCount% == 0 notepad++.exe%Files% endlocal
最好的解决办法是在追加下一个文件名之前检查每个循环运行环境变量的当前长度。 但是,这会使批处理文件变慢,通常文件名与路径不会太长,每个记事本+ +执行25个文件真的是一个问题。
那么理论上讲,一个包含路径的文件名可能已经太长了,无法分配给一个环境变量。
注意:如果批处理文件执行在启动Notepad ++后暂停,并且不需要这种行为,请在每个Notepad++.exe
插入左边的文本字符串,然后在带有空标题字符串的独立进程中启动Notepad ++ 。 Notepad++.exe
之前的START命令之后不要省略""
,否则会将第一个双引号字符串(=带路径的第一个文件名)解释为标题字符串。
为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
dir /?
echo /?
endlocal /?
for /?
if /?
set /?
setlocal /?
start /?
另请参阅Microsoft有关使用命令重定向操作符来解释2>nul
。 重定向操作符>
在这里用^
来转义,以在执行命令DIR时将STDERR的重定向应用到设备NUL 。 如果在当前目录或任何子目录中找不到任何zed.txt
,则使用此重定向来抑制由命令DIR输出的错误消息。
这可能是我在这个线程中的旧脚本的解决方案: 通过cmd打开一个文件,并显示在特定的编辑器中选择
我只是修改它打开Notepad ++而不是Sublime Text 3 Editor
@ECHO OFF Title Edit the selected file with Notepad++ :MenuLoop Cls & Color 0A SETLOCAL SET "ROOT=%userprofile%\Desktop" SET "EXT=*.txt" SET "Count=0" SETLOCAL enabledelayedexpansion REM Iterates throw the files on this current folder. REM And Populate the array with existent files in folder FOR /f "delims=" %%f IN ('dir /b /s "%ROOT%\%EXT%"') DO ( SET /a "Count+=1" set "list[!Count!]=%%~nf" set "listpath[!Count!]=%%~dpFf" ) echo wscript.echo Len("%ROOT%"^) + 20 >"%tmp%\length.vbs" for /f %%a in ('Cscript /nologo "%tmp%\length.vbs"') do ( set "cols=%%a") If %cols% LSS 50 set /a cols=%cols% + 15 set Files=%Count% set /a lines=%Count% + 10 Mode con cols=%cols% lines=%lines% ECHO ******************************************************* ECHO Folder : "%ROOT%" ECHO ******************************************************* rem Display array elements for /L %%i in (1,1,%Files%) do echo [%%i] : !list[%%i]! SET /a "COUNT_TOT=%Count%" ECHO. ECHO Total of [%EXT%] files(s) : %Count% file(s) echo( echo Type the number of what file did you want to edit ? set /p "Input=" set "MyEditor=%programfiles%\notepad++\notepad++.exe" For /L %%i in (1,1,%Count%) Do ( If "%INPUT%" EQU "%%i" ( Rem Testing if Notepad++.exe exist to open with it the text file If Exist "%MyEditor%" ( Start "Sublime" "%MyEditor%" "!listpath[%%i]!" Rem Otherwise we open the text file with defalut application like notepad ) else ( Start "" Notepad.exe "!listpath[%%i]!" ) ) ) EndLocal Goto:MenuLoop