2016-08-09 85 views
6

Co chcę zrobić: Użyj polecenia dir, aby znaleźć kilka plików tekstowych, a następnie otwórz je wszystkie w Notatniku ++. Najlepiej w jednym poleceniu bez tworzenia dodatkowych plików. Normalnie, można po prostu powiedziećOtwórz wiele plików z wyjścia polecenia cmd z notatnikiem ++

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

Ale muszę otworzyć wiele plików w skomplikowanej strukturze katalogów.

czuję się jak byłbym w stanie zrobić coś takiego:

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

To daje mi wyjście chcę (rekursywnie wyszukuje pliki i wypluwa tylko nazwy plików), ale każdy w oddzielnym wierszu i Notepad ++ ich nie otwiera, po prostu otwiera i prosi o utworzenie pliku "notepad ++" - który jest pusty.

Nawet stosując dodatkowy plik (niepożądana, ale nie zalecane) nie działa:

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

lub

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

nb Katalog Notepad ++ jest na mojej ścieżce.

Oczywiście moje umiejętności przekierowania nie są dobre. Pomoc jest bardzo cenna.

Odpowiedz

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

To wydaje się działać dla mnie. Oczywiście będziesz musiał zmodyfikować kryteria "dir/b" do plików, które chcesz dopasować.

To polecenie wykonuje pętlę przez wszystkie pliki wypisane przez katalog (tylko pliki CSV w moim przypadku) i otwiera je za pomocą notatnika ++. Pamiętaj, aby dołączyć polecenie/b po poleceniu dir, aby wyprowadzać tylko nazwy plików bez wszystkich innych informacji.

+0

Spowoduje to niepowodzenie w nazwach plików ze spacjami. Musisz również dodać opcję/S do rekursywnego wyszukiwania. – Squashman

+0

Czy istnieje poprawka do polecenia do pracy ze spacjami w nazwach plików, które znasz z góry? – TheRealKernel

+0

Dziękuję za edycję @Squashman, przetestowałem go ze spacjami w nazwie pliku i zadziałało to dla mnie. – TheRealKernel

1

Przekierowanie nazwy plików ze ścieżką bez cudzysłów z poleceniem DIR do Notepad ++ nie działa, ponieważ Notepad ++ to aplikacja GUI, który nie czyta w nazwach plików ze standardowego strumienia wejściowego STDIN linia po linii .

Notatnik ++ oczekuje, że rozdzielona spacjami lista (podwójnie cytowanych) nazw plików będzie parametrem (-ami) wiersza polecenia, przy czym podwójne cudzysłowy wokół nazwy pliku bez ścieżki, ścieżki względnej lub ścieżki bezwzględnej nie są zawsze potrzebne w zależności od znaków w nazwie pliku i ścieżce pliku.

Moja pierwsza propozycja to:

@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 

Ten kod partii Łączy odnaleziono plików do długiej listy parametrów wychodząc zawsze z miejsca i zaczyna Notepad ++ z tej listy.

Problem z tym prostym kodem polega na tym, że długość listy parametrów może przekraczać maksymalną długość ciągu zmiennej środowiskowej, jeśli istnieje naprawdę wiele plików o nazwie pliku zed.txt.

Prostym rozwiązaniem byłoby ograniczenie liczby plików na Notepad ++ biegu na przykład do 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 

Najlepszym rozwiązaniem byłoby sprawdzić na każdej pętli uruchomić aktualną długość zmiennej środowiskowej przed dodaniem następnej nazwy pliku. Ale to spowodowałoby, że plik wsadowy wolniej i zazwyczaj nazwy plików ze ścieżką nie są tak długie, że 25 plików na wykonanie jest naprawdę problemem.

Cóż, teoretycznie pojedyncza nazwa pliku ze ścieżką może być już zbyt długa, aby można ją było przypisać do zmiennej środowiskowej.

Uwaga: Jeżeli wykonanie pliku wsadowego zostanie wstrzymane po rozpoczęciu Notepad ++ i takie zachowanie nie jest poszukiwany, włóż lewej do każdego Notepad++.exe ciąg start "" zacząć Notepad ++ w oddzielnym procesie z pustym tytułowego napisu. Nie pomijaj "" po komendzie START przed Notepad++.exe ponieważ w przeciwnym razie pierwszy podwójny cudzysłów (= pierwsza nazwa pliku ze ścieżką) zostanie zinterpretowany jako ciąg znaków.

Aby poznać używane polecenia i ich działanie, otwórz okno wiersza polecenia, wykonaj poniższe polecenia i przeczytaj uważnie wszystkie strony pomocy wyświetlane dla każdego polecenia.

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

Zobacz także artykuł o firmie Microsoft o numerze Using command redirection operators, aby uzyskać wyjaśnienie: 2>nul. Operator przekierowania > jest tutaj uciekł z ^ zastosować przekierowanie STDERR do urządzenia NUL na wykonanie polecenia DIR. To przekierowanie służy do tłumienia komunikatu o błędzie wyjścia komendą: DIR, jeśli nie można znaleźć żadnego zed.txt w bieżącym katalogu lub żadnym podkatalogu.

+0

Dzięki za odpowiedź na moją pierwotną próbę, a dodana głębia jest bardzo doceniana! – tonip

0

To może być rozwiązanie z mojego starego skryptu w tym wątku: Open a file through cmd and display the selected in specific editor

Właśnie zmodyfikowane go otworzyć z Notepad ++ zamiast Sublime Text 3 Edytor

@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 
4

To działa dla mnie w wiersza polecenia:

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

Wystarczy upewnić się, że list zmienna nie istnieje przed wykonaniem tej linii.