windows 用notepad++从cmd dir输出打开多个文件

hgc7kmma  于 2023-05-19  发布在  Windows
关注(0)|答案(5)|浏览(316)

我想做的是:使用dir命令查找一堆文本文件,然后在Notepad++中全部打开。最好是在单个命令中,而不创建额外的文件。一般来说你可以直接说

notepad++ zed.txt ./ted/zed.txt ./red/zed.txt

但是我需要在一个复杂的目录结构中打开许多文件。
我觉得我应该可以做这样的事情:

dir /s/a/b "zed.txt" | notepad++

这确实给予了我想要的输出(递归地找到文件并只吐出文件名),但每个文件都在自己的行上,Notepad不会打开它们,它只是打开并要求创建文件“notepad”-这是空的。
即使使用额外的文件(不可取,但不是首选)也不起作用:

c:\Users\tonip\Desktop\some_dir>dir /s/a/b "cmakelists.txt" > np.txt && notepad < np.txt

dir /s/a/b "cmakelists.txt" > np.txt
notepad++ < np.txt

注意:Notepad++目录在我的路径上。
显然,我的转向能力不好。非常感谢您的帮助。

j2cgzkjk

j2cgzkjk1#

这在命令行中对我有效:

(for /F "delims=" %a in ('dir /s/a/b "zed.txt") do call set "list=%list% "%a"") & call notepad++ %list%

在执行这一行之前,请确保list变量不存在。

cclgggtu

cclgggtu2#

for /f "delims=" %a IN ('dir /a-d /b /s *.csv') do call notepad++ "%a"

这似乎对我有用。当然,您需要修改您的'dir /B'条件,以匹配您试图匹配的任何文件。
这个命令循环通过dir输出的所有文件(在我的例子中只有csv文件),并用notepad++打开它们。确保在dir命令后包含/b,以便只输出文件名,而不输出所有其他信息。

n1bvdmb6

n1bvdmb63#

将带有路径(不带双引号)的文件名从命令DIR重定向到 Notepad++ 不起作用,因为 Notepad++ 是一个GUI应用程序,它不会从标准输入流STDIN逐行读取文件名。

  • Notepad++* 需要一个空格分隔的(双引号)文件名列表作为命令行参数,因此不需要在没有路径、相对路径或绝对路径的文件名周围加上双引号,具体取决于文件名和文件路径中的字符。

我的第一个建议是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Files="
for /F "delims=" %%I in ('dir zed.txt /A-D /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 /A-D /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

最好的解决方案是在每次循环运行时,在追加下一个文件名之前检查环境变量的当前长度。但这会使批处理文件变慢,通常带有路径的文件名不会太长,以至于每次执行 Notepad++ 25个文件确实是个问题。
好吧,从理论上讲,一个带有路径的文件名对于分配给环境变量来说可能已经太长了。

注意:如果启动 Notepad++ 后,批处理文件执行停止,并且不希望出现这种情况,请向每个Notepad++.exe的左侧插入字符串start "",以便在单独的进程中使用空标题字符串启动 Notepad++。不要在Notepad++.exe之前的命令START之后省略"",否则第一个双引号字符串(=第一个文件名和路径)将被解释为标题字符串。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • set /?
  • setlocal /?
  • start /?

另请参阅有关Using command redirection operators的Microsoft文档页面,了解2>nul的解释。重定向运算符>在这里使用^进行转义,以便在执行命令DIR时将STDERR重定向到设备NUL。此重定向用于在当前目录或任何子目录中找不到zed.txt时抑制命令DIR输出的错误消息。

7eumitmz

7eumitmz4#

您也可以在Ubuntu(wsl)上这样做

for file in $(find -type f)
do
    notepad++.exe $file
done

简写为:

for file in $(find -name zed.txt); do notepad++.exe $file;done

对此的变化是排除某些子文件夹。这个脚本将排除任何临时文件夹,如.git

for dir in $(find -maxdepth 1 -type d;egrep -v '^\./\.')
do
    for file in $(find $dir -type f|egrep '(zed|foo)')
    do
        notepad++.exe $file
    done
done

或在打开文件之前扫描文本:

for file in $(find -type f|egrep '(zed|foo)')
do
    for l in $(cat $file|egrep -i '(foo)')
    do
        notepad++.exe $file
        break
    done
done
zvms9eto

zvms9eto5#

下面是一个在notepad++中打开文件的例子,文件共享匹配一个模式。将此代码放入“finder.bat”文件并双击它。

for /f "delims=" %%f IN ('dir /b /s "\\server\c$\Program Files (x86)\MyUtility\*.exe.config"') do call "C:\Program Files (x86)\Notepad++\notepad++.exe" %%~sdpnxf

https://stackoverflow.com/a/5564349/194872制定的想法

相关问题