Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| python:porting_python_2_to_pyton_3 [2020/01/22 15:29] – WIP apressato | python:porting_python_2_to_pyton_3 [2020/01/22 18:01] (versione attuale) – WIP apressato | ||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| ====== Porting da Python 2 a Python 3 ====== | ====== Porting da Python 2 a Python 3 ====== | ||
| - | <WRAP center round important 60%> | ||
| - | ***WIP***: Quello seguente è un articolo in divenire | ||
| - | </ | ||
| Linea 552: | Linea 549: | ||
| </ | </ | ||
| - | == Python 3 == | + | == Python |
| <code python> | <code python> | ||
| - | # Python 2 and 3: | ||
| for key in heights: | for key in heights: | ||
| ... | ... | ||
| + | </ | ||
| + | |||
| + | === I Valori === | ||
| + | == Python 2 == | ||
| + | <code python> | ||
| + | for value in heights.itervalues(): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | == Python 2 e 3 == | ||
| + | <code python> | ||
| + | #Opzione 0: Sconsigliata | ||
| + | for value in heights.values(): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 1 | ||
| + | from builtins import dict | ||
| + | |||
| + | heights = dict(Fred=175, | ||
| + | for key in heights.values(): | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 2 | ||
| + | from builtins import itervalues | ||
| + | |||
| + | for key in itervalues(heights): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | === Gli Elementi === | ||
| + | == Python 2 == | ||
| + | <code python> | ||
| + | for (key, value) in heights.iteritems(): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | == Python 2 e 3 == | ||
| + | <code python> | ||
| + | # Opzione 1 | ||
| + | for (key, value) in heights.items(): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 2 | ||
| + | from future.utils import viewitems | ||
| + | |||
| + | for (key, value) in viewitems(heights): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 3 | ||
| + | from future.utils import iteritems | ||
| + | |||
| + | for (key, value) in iteritems(heights): | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | ==== Chiavi/ | ||
| + | === Chiavi === | ||
| + | == Python 2 == | ||
| + | <code python> | ||
| + | keylist = heights.keys() | ||
| + | assert isinstance(keylist, | ||
| + | </ | ||
| + | == Python 2 e 3 == | ||
| + | <code python> | ||
| + | keylist = list(heights) | ||
| + | assert isinstance(keylist, | ||
| + | </ | ||
| + | |||
| + | === Valori === | ||
| + | == Python 2 == | ||
| + | <code python> | ||
| + | heights = {' | ||
| + | valuelist = heights.values() | ||
| + | assert isinstance(valuelist, | ||
| + | </ | ||
| + | == Python 2 e 3 == | ||
| + | <code python> | ||
| + | # Opzione 1 | ||
| + | valuelist = list(heights.values()) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 2 | ||
| + | from builtins import dict | ||
| + | |||
| + | heights = dict(Fred=175, | ||
| + | valuelist = list(heights.values()) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 3 | ||
| + | from future.utils import listvalues | ||
| + | |||
| + | valuelist = listvalues(heights) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 4 | ||
| + | from future.utils import itervalues | ||
| + | |||
| + | valuelist = list(itervalues(heights)) | ||
| + | </ | ||
| + | |||
| + | === Elementi === | ||
| + | == Python 2 e 3 == | ||
| + | <code python> | ||
| + | # Opzione 1 | ||
| + | itemlist = list(heights.items()) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 2 | ||
| + | from future.utils import listitems | ||
| + | |||
| + | itemlist = listitems(heights) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Opzione 3 | ||
| + | from future.utils import iteritems | ||
| + | |||
| + | itemlist = list(iteritems(heights)) | ||
| </ | </ | ||
| Linea 584: | Linea 709: | ||
| </ | </ | ||
| ===== Altre variazioni ai builtins ===== | ===== Altre variazioni ai builtins ===== | ||
| + | ==== File IO con open() ==== | ||
| + | <code python> | ||
| + | # Python 2 only | ||
| + | f = open(' | ||
| + | data = f.read() | ||
| + | text = data.decode(' | ||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from io import open | ||
| + | f = open(' | ||
| + | data = f.read() | ||
| + | text = data.decode(' | ||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | from io import open | ||
| + | f = open(' | ||
| + | text = f.read() | ||
| + | </ | ||
| + | |||
| + | ==== reduce() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | assert reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) == 1+2+3+4+5 | ||
| + | |||
| + | |||
| + | # Python 2 and 3: | ||
| + | from functools import reduce | ||
| + | |||
| + | assert reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) == 1+2+3+4+5 | ||
| + | </ | ||
| + | |||
| + | ==== file() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | f = file(pathname) | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 and 3: | ||
| + | f = open(pathname) | ||
| + | |||
| + | # But preferably, use this: | ||
| + | from io import open | ||
| + | f = open(pathname, | ||
| + | # or | ||
| + | f = open(pathname, | ||
| + | </ | ||
| + | |||
| + | ==== exec ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | exec 'x = 10' | ||
| + | |||
| + | # Python 2 and 3: | ||
| + | exec(' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | g = globals() | ||
| + | exec 'x = 10' in g | ||
| + | |||
| + | # Python 2 and 3: | ||
| + | g = globals() | ||
| + | exec(' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | l = locals() | ||
| + | exec 'x = 10' in g, l | ||
| + | |||
| + | # Python 2 and 3: | ||
| + | exec(' | ||
| + | </ | ||
| + | |||
| + | ==== execfile() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | execfile(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from past.builtins import execfile | ||
| + | |||
| + | execfile(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | exec(compile(open(' | ||
| + | |||
| + | |||
| + | # This can sometimes cause this: | ||
| + | # | ||
| + | # See https:// | ||
| + | </ | ||
| + | |||
| + | ==== unichr() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | assert unichr(8364) == ' | ||
| + | |||
| + | # Python 3 only: | ||
| + | assert chr(8364) == ' | ||
| + | |||
| + | # Python 2 and 3: | ||
| + | from builtins import chr | ||
| + | assert chr(8364) == ' | ||
| + | </ | ||
| + | |||
| + | ==== intern() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | intern(' | ||
| + | |||
| + | |||
| + | # Python 3 only: | ||
| + | from sys import intern | ||
| + | intern(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from past.builtins import intern | ||
| + | intern(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | from six.moves import intern | ||
| + | intern(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 3 | ||
| + | from future.standard_library import install_aliases | ||
| + | install_aliases() | ||
| + | from sys import intern | ||
| + | intern(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 4 | ||
| + | try: | ||
| + | from sys import intern | ||
| + | except ImportError: | ||
| + | pass | ||
| + | intern(' | ||
| + | </ | ||
| + | |||
| + | ==== apply() ==== | ||
| + | <code python> | ||
| + | args = (' | ||
| + | kwargs = {' | ||
| + | |||
| + | |||
| + | # Python 2 only: | ||
| + | apply(f, args, kwargs) | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | f(*args, **kwargs) | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | from past.builtins import apply | ||
| + | apply(f, args, kwargs) | ||
| + | </ | ||
| + | |||
| + | ==== chr() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | assert chr(64) == b' | ||
| + | assert chr(200) == b' | ||
| + | |||
| + | |||
| + | # Python 3 only: option 1 | ||
| + | assert chr(64).encode(' | ||
| + | assert chr(0xc8).encode(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: option 1 | ||
| + | from builtins import chr | ||
| + | |||
| + | assert chr(64).encode(' | ||
| + | assert chr(0xc8).encode(' | ||
| + | |||
| + | |||
| + | # Python 3 only: option 2 | ||
| + | assert bytes([64]) == b' | ||
| + | assert bytes([0xc8]) == b' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: option 2 | ||
| + | from builtins import bytes | ||
| + | |||
| + | assert bytes([64]) == b' | ||
| + | assert bytes([0xc8]) == b' | ||
| + | </ | ||
| + | |||
| + | ==== cmp() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | assert cmp(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from past.builtins import cmp | ||
| + | assert cmp(' | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | cmp = lambda(x, y): (x > y) - (x < y) | ||
| + | assert cmp(' | ||
| + | </ | ||
| + | |||
| + | ==== reload() ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | reload(mymodule) | ||
| + | |||
| + | |||
| + | # Python 2 and 3 | ||
| + | from imp import reload | ||
| + | reload(mymodule) | ||
| + | </ | ||
| ===== Standard library ===== | ===== Standard library ===== | ||
| + | ==== dbm modules ==== | ||
| + | <code python> | ||
| + | # Python 2 only | ||
| + | import anydbm | ||
| + | import whichdb | ||
| + | import dbm | ||
| + | import dumbdbm | ||
| + | import gdbm | ||
| + | # Python 2 and 3: alternative 1 | ||
| + | from future import standard_library | ||
| + | standard_library.install_aliases() | ||
| - | ===== Modernize ===== | + | import dbm |
| + | import dbm.ndbm | ||
| + | import dbm.dumb | ||
| + | import dbm.gnu | ||
| + | # Python 2 and 3: alternative 2 | ||
| + | from future.moves import dbm | ||
| + | from future.moves.dbm import dumb | ||
| + | from future.moves.dbm import ndbm | ||
| + | from future.moves.dbm import gnu | ||
| + | # Python 2 and 3: alternative 3 | ||
| + | from six.moves import dbm_gnu | ||
| + | # (others not supported) | ||
| + | </ | ||
| + | ==== commands / subprocess modules ==== | ||
| + | <code python> | ||
| + | # Python 2 only | ||
| + | from commands import getoutput, getstatusoutput | ||
| + | # Python 2 and 3 | ||
| + | from future import standard_library | ||
| + | standard_library.install_aliases() | ||
| + | from subprocess import getoutput, getstatusoutput | ||
| + | </ | ||
| + | ==== subprocess.check_output() ==== | ||
| + | <code python> | ||
| + | # Python 2.7 and above | ||
| + | from subprocess import check_output | ||
| + | # Python 2.6 and above: alternative 1 | ||
| + | from future.moves.subprocess import check_output | ||
| + | |||
| + | # Python 2.6 and above: alternative 2 | ||
| + | from future import standard_library | ||
| + | standard_library.install_aliases() | ||
| + | |||
| + | from subprocess import check_output | ||
| + | </ | ||
| + | |||
| + | ==== Collections: | ||
| + | <code python> | ||
| + | # Python 2.7 and above | ||
| + | from collections import Counter, OrderedDict | ||
| + | |||
| + | # Python 2.6 and above: alternative 1 | ||
| + | from future.moves.collections import Counter, OrderedDict | ||
| + | |||
| + | # Python 2.6 and above: alternative 2 | ||
| + | from future import standard_library | ||
| + | standard_library.install_aliases() | ||
| + | |||
| + | from collections import Counter, OrderedDict | ||
| + | </ | ||
| + | |||
| + | ==== StringIO module ==== | ||
| + | <code python> | ||
| + | # Python 2 only | ||
| + | from StringIO import StringIO | ||
| + | from cStringIO import StringIO | ||
| + | |||
| + | # Python 2 and 3 | ||
| + | from io import BytesIO | ||
| + | # and refactor StringIO() calls to BytesIO() if passing byte-strings | ||
| + | </ | ||
| + | |||
| + | ==== http module ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import httplib | ||
| + | import Cookie | ||
| + | import cookielib | ||
| + | import BaseHTTPServer | ||
| + | import SimpleHTTPServer | ||
| + | import CGIHttpServer | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import http.client | ||
| + | import http.cookies | ||
| + | import http.cookiejar | ||
| + | import http.server | ||
| + | </ | ||
| + | |||
| + | ==== xmlrpc module ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import DocXMLRPCServer | ||
| + | import SimpleXMLRPCServer | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import xmlrpc.server | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import xmlrpclib | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import xmlrpc.client | ||
| + | </ | ||
| + | |||
| + | ==== html escaping and entities ==== | ||
| + | <code python> | ||
| + | # Python 2 and 3: | ||
| + | from cgi import escape | ||
| + | |||
| + | # Safer (Python 2 and 3, after ``pip install future``): | ||
| + | from html import escape | ||
| + | |||
| + | # Python 2 only: | ||
| + | from htmlentitydefs import codepoint2name, | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | from html.entities import codepoint2name, | ||
| + | </ | ||
| + | |||
| + | ==== html parsing ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from HTMLParser import HTMLParser | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``) | ||
| + | from html.parser import HTMLParser | ||
| + | |||
| + | # Python 2 and 3 (alternative 2): | ||
| + | from future.moves.html.parser import HTMLParser | ||
| + | </ | ||
| + | |||
| + | ==== urllib module ==== | ||
| + | '' | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from urlparse import urlparse | ||
| + | from urllib import urlencode | ||
| + | from urllib2 import urlopen, Request, HTTPError | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 3 only: | ||
| + | from urllib.parse import urlparse, urlencode | ||
| + | from urllib.request import urlopen, Request | ||
| + | from urllib.error import HTTPError | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 and 3: easiest option | ||
| + | from future.standard_library import install_aliases | ||
| + | install_aliases() | ||
| + | |||
| + | from urllib.parse import urlparse, urlencode | ||
| + | from urllib.request import urlopen, Request | ||
| + | from urllib.error import HTTPError | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 and 3: alternative 2 | ||
| + | from future.standard_library import hooks | ||
| + | |||
| + | with hooks(): | ||
| + | from urllib.parse import urlparse, urlencode | ||
| + | from urllib.request import urlopen, Request | ||
| + | from urllib.error import HTTPError | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 and 3: alternative 3 | ||
| + | from future.moves.urllib.parse import urlparse, urlencode | ||
| + | from future.moves.urllib.request import urlopen, Request | ||
| + | from future.moves.urllib.error import HTTPError | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Python 2 and 3: alternative 4 | ||
| + | try: | ||
| + | from urllib.parse import urlparse, urlencode | ||
| + | from urllib.request import urlopen, Request | ||
| + | from urllib.error import HTTPError | ||
| + | except ImportError: | ||
| + | from urlparse import urlparse | ||
| + | from urllib import urlencode | ||
| + | from urllib2 import urlopen, Request, HTTPError | ||
| + | </ | ||
| + | |||
| + | ==== Tkinter ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import Tkinter | ||
| + | import Dialog | ||
| + | import FileDialog | ||
| + | import ScrolledText | ||
| + | import SimpleDialog | ||
| + | import Tix | ||
| + | import Tkconstants | ||
| + | import Tkdnd | ||
| + | import tkColorChooser | ||
| + | import tkCommonDialog | ||
| + | import tkFileDialog | ||
| + | import tkFont | ||
| + | import tkMessageBox | ||
| + | import tkSimpleDialog | ||
| + | import ttk | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import tkinter | ||
| + | import tkinter.dialog | ||
| + | import tkinter.filedialog | ||
| + | import tkinter.scrolledtext | ||
| + | import tkinter.simpledialog | ||
| + | import tkinter.tix | ||
| + | import tkinter.constants | ||
| + | import tkinter.dnd | ||
| + | import tkinter.colorchooser | ||
| + | import tkinter.commondialog | ||
| + | import tkinter.filedialog | ||
| + | import tkinter.font | ||
| + | import tkinter.messagebox | ||
| + | import tkinter.simpledialog | ||
| + | import tkinter.ttk | ||
| + | </ | ||
| + | |||
| + | ==== socketserver ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import SocketServer | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import socketserver | ||
| + | </ | ||
| + | |||
| + | ==== copy_reg, copyreg ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | import copy_reg | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | import copyreg | ||
| + | </ | ||
| + | |||
| + | ==== configparser ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from ConfigParser import ConfigParser | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install configparser``): | ||
| + | from configparser import ConfigParser | ||
| + | </ | ||
| + | |||
| + | ==== queue ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from Queue import Queue, heapq, deque | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | from queue import Queue, heapq, deque | ||
| + | </ | ||
| + | |||
| + | ==== repr, reprlib ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from repr import aRepr, repr | ||
| + | |||
| + | # Python 2 and 3 (after ``pip install future``): | ||
| + | from reprlib import aRepr, repr | ||
| + | </ | ||
| + | |||
| + | ==== UserDict, UserList, UserString ==== | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from UserDict import UserDict | ||
| + | from UserList import UserList | ||
| + | from UserString import UserString | ||
| + | |||
| + | |||
| + | # Python 3 only: | ||
| + | from collections import UserDict, UserList, UserString | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from future.moves.collections import UserDict, UserList, UserString | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | from six.moves import UserDict, UserList, UserString | ||
| + | |||
| + | |||
| + | # Python 2 and 3: alternative 3 | ||
| + | from future.standard_library import install_aliases | ||
| + | install_aliases() | ||
| + | from collections import UserDict, UserList, UserString | ||
| + | </ | ||
| + | |||
| + | ==== itertools: filterfalse, | ||
| + | <code python> | ||
| + | # Python 2 only: | ||
| + | from itertools import ifilterfalse, | ||
| + | |||
| + | # Python 3 only: | ||
| + | from itertools import filterfalse, | ||
| + | |||
| + | # Python 2 and 3: alternative 1 | ||
| + | from future.moves.itertools import filterfalse, | ||
| + | |||
| + | # Python 2 and 3: alternative 2 | ||
| + | from six.moves import filterfalse, | ||
| + | |||
| + | # Python 2 and 3: alternative 3 | ||
| + | from future.standard_library import install_aliases | ||
| + | install_aliases() | ||
| + | from itertools import filterfalse, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Python-Modernize ===== | ||
| + | |||
| + | ==== Scopo del progetto ==== | ||
| + | Questa libreria è un wrapper attorno a '' | ||
| + | |||
| + | Il comando python-modernize funziona come 2to3. Ecco come riscrivere un singolo file: | ||
| + | |||
| + | <code bash> | ||
| + | python-modernize -w example.py | ||
| + | </ | ||
| + | |||
| + | Il sito Web del progetto è disponibile su [[https:// | ||
| + | |||
| + | ==== Una nota sulla gestione delle stringhe ==== | ||
| + | * Di default modernize non cambia le stringhe Unicode. \\ Questa è l' | ||
| + | * In alternativa, | ||
| + | * L' | ||
| + | |||
| + | ==== Preparazione ==== | ||
| + | Dal prompt dei comandi lanciare | ||
| + | <code bash> | ||
| + | pip --install modernize | ||
| + | </ | ||
| + | Al termine dell' | ||
| + | |||
| + | ==== Batch di conversione ==== | ||
| + | <code batch> | ||
| + | set mydatetime=%date: | ||
| + | set logpath=.\Logs | ||
| + | set logfile=%logpath%\Migrate_%Application%_2to3_%mydatetime%.log | ||
| + | set RepoPath=path\to\your \web2py\applications | ||
| + | set Application=Your_Folder_App_Name | ||
| + | |||
| + | IF NOT EXIST %logpath% ( | ||
| + | MKDIR %logpath% | ||
| + | ) | ||
| + | |||
| + | (FOR /f " | ||
| + | (FOR /f " | ||
| + | (FOR /f " | ||
| + | </ | ||
| Linea 605: | Linea 1313: | ||
| - [[https:// | - [[https:// | ||
| - [[https:// | - [[https:// | ||
| + | - [[https:// | ||

