• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Bat. czemu nie tworzy plików

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
162 wizyt
pytanie zadane 28 listopada w Inne języki przez TOWaD Mądrala (6,250 p.)

Czy koś wie dlaczego ten .bat nie tworzy plików. A kompilatora c++ nie mam na razie.

@echo off
setlocal enabledelayedexpansion

set "input_file=plik.txt"
set "output_file="
set "capture=false"

echo Otwieranie pliku %input_file%

for /f "tokens=* delims=" %%A in ('type "%input_file%"') do (
    set "line=%%A"
    echo Przetwarzanie linii: !line!
    
    if "!line!"=="::: koniec pliku :::" (
        echo Koniec pliku dla !output_file!
        set "capture=false"
        set "output_file="
    ) else (
        if "!line:~0,3!"==":::" (
            for /f "tokens=2 delims=:" %%B in ("!line!") do (
                set "output_file=%%B"
                echo Tworzenie pliku: !output_file!
                set "capture=true"
                (echo.> "!output_file!") || (echo Błąd: Nie można utworzyć pliku: !output_file!)
            )
        ) else (
            if "!capture!"=="true" (
                echo Dodawanie do !output_file!: !line!
                (echo.!line!>> "!output_file!") || (echo Błąd: Nie można dopisać do pliku: !output_file!)
            )
        )
    )
)

echo Pliki zostały utworzone.
pause

Pomył mój ale kod nie, czy ktoś w prostych słowach może wyjaśnić dlaczego nie działa to narzędzie.

::: index.html :::
<!DOCTYPE html>
<html lang="pl">
</html>
::: koniec pliku :::

::: main.js :::
const a;
::: koniec pliku :::

::: settings.js :::
const b;
::: koniec pliku :::

::: finalSettings.js :::
document.getElementById("finishButton").addEventListener('click', () => window.close());
::: koniec pliku :::

 

komentarz 29 listopada przez adrian17 Mentor (350,940 p.)
Bash raczej nie jest super popularny, sam nawet nie wiem co to ma robić :P

I też nie wiem co ma C++ do tego.
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
Jak można było utworzyć statyczny plik c++ w katalogu i nie ma problemu z podziałem na txt na dowolne pliki, może jeszcze niektóre wyczyść, niektóre dodać. Troch ten język znam i jak jakiś błąd to potrafię sam poprawić. A tu muszę się poduczyć, lub jednak lepiej zainstalować minGW i się nie fokusować na nowej rzeczy tylko korzystając,  z tego że mam trochę czasu i pomocnika to spróbować zrealizować, to co oddawana siedzi w głowie.
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
edycja 30 listopada przez TOWaD

Jak zwykle genialny plan nie zadziałał [online] (ಥ﹏ಥ). Ale damy radę, tylko idę bo mi robaki drewno zjedzą  i nie będzie czego rąbać :)

Edit: Jak się przeczyta (a nie czyta tylko pisze) [online]

komentarz 30 listopada przez adrian17 Mentor (350,940 p.)
Jestem skonfundowany głównie dlatego, że akurat ze wszystkich języków i technologii wymienionych w tych odpowiedziach, C++ się absolutnie najgorzej nadaje do tego typu operacji na plikach tekstowych :P (...choć może cmd jeszcze gorzej)

(też nie wiem co ma wasm do tego)
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
W moim przypadku to nie ma przestrzeni dla nowych języków. Toczę nierówną walkę by nie zapomnieć tego czego się nauczyłem (narzazie przegrywam).

A wasm łączy, to czego się nauczyłem. I może to będzie przyszłość,a takie aplikacje online z szybkością natywną brzmi nieźle.
komentarz 1 grudnia przez TOWaD Mądrala (6,250 p.)
A i taki mały komentarz AI jest do niczego, jak się nie zna dobre podstaw języka, co widać na postawie tego .bat

2 odpowiedzi

+1 głos
odpowiedź 29 listopada przez VBService Ekspert (256,320 p.)
wybrane 30 listopada przez TOWaD
 
Najlepsza

Ta część kodu wymaga zmiany

            for /f "tokens=2 delims=:" %%B in ("!line!") do (
                set "output_file=%%B"
                echo Tworzenie pliku: !output_file!
                set "capture=true"
                (echo.> "!output_file!") || (echo Błąd: Nie można utworzyć pliku: !output_file!)
            )

ponieważ nieprawidłowo przetwarza linie ::: nazwa pliku :::

proponuje takie zmiany

@echo off
setlocal enabledelayedexpansion
 
set "input_file=plik.txt"
set "output_file="
set "capture=false"
 
echo Otwieranie pliku %input_file%
 
for /f "tokens=* delims=" %%A in ('type "%input_file%"') do (
    set "line=%%A"
    echo Przetwarzanie linii: !line!
     
    if "!line!"=="::: koniec pliku :::" (
        echo Koniec pliku dla !output_file!
        set "capture=false"
        set "output_file="
    ) else (
        if "!line:~0,3!"==":::" (
            set "output_file=!line:~4!"
            echo Tworzenie pliku: !output_file!
            set "capture=true"
            (echo.> "!output_file!") || (echo Błąd: Nie można utworzyć pliku: !output_file!)
        ) else (
            if "!capture!"=="true" (
                echo Dodawanie do !output_file!: !line!
                (echo.!line!>> "!output_file!") || (echo Błąd: Nie można dopisać do pliku: !output_file!)
            )
        )
    )
)
 
echo Pliki zostały utworzone.
pause

i kosmetyczne zmiany w pliku z zapisu ::: nazwa pliku :::  do ::: nazwa pliku

::: index.html
<!DOCTYPE html>
<html lang="pl">
</html>
::: koniec pliku ::: 
::: main.js
const a;
::: koniec pliku ::: 
::: settings.js
const b;
::: koniec pliku ::: 
::: finalSettings.js
document.getElementById("finishButton").addEventListener('click', () => window.close());
::: koniec pliku :::

 

 

BTW, jak słusznie zauważył @adrian17; plik wsadowy (Batch File Language) IMO nie nadaje się do tego typu akcji.
Rozważ użycie: VBScript (VBS)PowerShell, Python (w trybie CLI), PHP (w trybie CLI) itp.

IMO może lepiej nie tworzyć jednego pliku plik.txt z kodem (html, js) tylko od razu zapisać je w osobnych plikach .htm, .js i spakować np. zip-em, rar-em, itp. i mieć je spakowane jako jeden plik, druga korzyść, pakowanie zmniejsza wielkość plików.

komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
edycja 30 listopada przez TOWaD
Dzięki. Jednak tak czy inaczej nie działa. Jeszcze raz dzięki ale odpuszczę sobie rozkminię, wiem że się napracowałeś, ale jednak lepiej będę szlifował to co znam. Docelowo znajomość wasm może za parę zim. Szczególnie że c++ fajnie się rozwija.
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)

Dobra AI przetłumaczył na mi znany język

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

int main() {
    std::string input_file = "plik.txt";
    std::ifstream infile(input_file);
    if (!infile) {
        std::cerr << "Error: Cannot open file " << input_file << std::endl;
        return 1;
    }

    std::vector<std::string> file_names;
    std::string line;
    std::ofstream outfile;
    bool capture = false;

    std::cout << "---- Początek skryptu ----" << std::endl;
    std::cout << "Otwieranie pliku: " << input_file << std::endl;

    while (std::getline(infile, line)) {
        std::cout << "Przetwarzanie linii: " << line << std::endl;
        
        if (line == "::: koniec pliku :::") {
            std::cout << "Koniec pliku dla: " << outfile << std::endl;
            capture = false;
        } else if (line.substr(0, 3) == ":::" && line.size() > 3) {
            std::string output_file = line.substr(4, line.size() - 5);
            outfile.close();
            outfile.open(output_file);
            if (!outfile) {
                std::cerr << "Błąd: Nie można utworzyć pliku: " << output_file << std::endl;
            } else {
                std::cout << "---- Utworzono plik: " << output_file << " ----" << std::endl;
                file_names.push_back(output_file);
                capture = true;
            }
        } else if (capture) {
            std::cout << "Dodawanie do " << outfile << ": " << line << std::endl;
            if (outfile) {
                outfile << line << std::endl;
            } else {
                std::cerr << "Błąd: Nie można dopisać do pliku" << std::endl;
            }
        }
    }

    std::cout << "---- Koniec skryptu ----" << std::endl;
    std::cout << "Nazwy plików: ";
    for (size_t i = 0; i < file_names.size(); ++i) {
        std::cout << file_names[i];
        if (i < file_names.size() - 1) {
            std::cout << ", ";
        }
    }
    std::cout << std::endl;
    std::cout << "Liczba utworzonych plików: " << file_names.size() << std::endl;

    infile.close();
    return 0;
}

I wiem ze nie nie powinno być pustych linii. ctrl + A i ctrl + C nie mam wpływu co się znajdzie pomiędzy.początkiem pliku i końcem mogę tylko mieć wpływ na znacznik początku i końca pliku.

komentarz 30 listopada przez VBService Ekspert (256,320 p.)
edycja 30 listopada przez VBService

Dzięki. Jednak tak czy inaczej nie działa. 

co masz na myśli, przez to stwierdzenie?

U Mnie to wygląda tak.

 

komentarz 30 listopada przez VBService Ekspert (256,320 p.)

Znalazłem przyczynę w pliku: plik.txt - nadmiarowe spacje.

nie wiem dlaczego bloczek kodu dodaje te spacje po wklejeniu kodu bez tych spacji. crying

1
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
Dzięki śliczne. Jak mi się juto uda uruchomić to dam najlepszą.
komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
Działa super.
0 głosów
odpowiedź 29 listopada przez mokrowski Mędrzec (156,420 p.)
Pomieszałeś 2 języki programowania. Część jest w bat, a część w c. To nie ma prawa działać.
komentarz 29 listopada przez VBService Ekspert (256,320 p.)

Kod działa jak najbardziej jako plik wsadowy smiley

komentarz 30 listopada przez TOWaD Mądrala (6,250 p.)
Jak mówiłem to nie mój kod. Tylko Al. Generalnie fajne kody pisze tylko, w tym samym czasie to bym pewnie jeden poprawny napisał. A tak mam 20 wersji i jak wycharczę błąd i poproszę o poprawkę to ok jak nie to trzeba od początku. Dlatego nie za dużo naraz, bo to się do niczego nie nadaje a jak po kolei to wiadomo gdzie błędu szukać, a kopiuj wklej, jest tak naprawdę bardzo uciążliwe.
komentarz 1 grudnia przez whiteman808 Gaduła (3,180 p.)
Możesz jak użyjesz odpowiedniej funkcji (chyba system, choć można też z tego co na stacku piszą użyć CreateProcess)

Podobne pytania

0 głosów
1 odpowiedź 554 wizyt
pytanie zadane 29 listopada 2017 w Inne języki przez domi10052 Obywatel (1,180 p.)
0 głosów
1 odpowiedź 284 wizyt
pytanie zadane 1 października 2015 w Inne języki przez Koms Początkujący (380 p.)
0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 7 listopada 2017 w C i C++ przez Sqcha Nowicjusz (140 p.)

93,182 zapytań

142,196 odpowiedzi

322,002 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1889p. - dia-Chann
  2. 1864p. - Łukasz Piwowar
  3. 1847p. - CC PL
  4. 1843p. - Łukasz Eckert
  5. 1805p. - Tomasz Bielak
  6. 1785p. - Michal Drewniak
  7. 1777p. - Łukasz Siedlecki
  8. 1774p. - rucin93
  9. 1744p. - rafalszastok
  10. 1724p. - Adrian Wieprzkowicz
  11. 1684p. - Mikbac
  12. 1624p. - Anonim 3619784
  13. 1520p. - Marcin Putra
  14. 1368p. - ssynowiec
  15. 1258p. - Dawid128
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...