W jaki sposób polecenie Windows RENAME (REN) interpretuje symbole wieloznaczne?
Wbudowana funkcja POMOC nie pomaga - w ogóle nie rozwiązuje symboli wieloznacznych.
Pomoc online Microsoft technet XP nie jest dużo lepsza. Oto wszystko, co ma do powiedzenia na temat symboli wieloznacznych:
„Możesz używać symboli wieloznacznych (
*
i?
) w dowolnym parametrze nazwy pliku. Jeśli użyjesz symboli wieloznacznych w nazwie pliku 2, znaki reprezentowane przez symbole wieloznaczne będą identyczne z odpowiednimi znakami w nazwie pliku 1”.
Niewiele pomocy - istnieje wiele sposobów interpretacji tego stwierdzenia.
W niektórych przypadkach udało mi się z powodzeniem użyć symboli wieloznacznych w parametrze nazwa_pliku2 , ale zawsze było to metodą prób i błędów. Nie byłem w stanie przewidzieć, co działa, a co nie. Często musiałem uciekać się do napisania małego skryptu wsadowego z pętlą FOR, która analizuje każdą nazwę, aby móc w razie potrzeby zbudować każdą nową nazwę. Niezbyt wygodne.
Gdybym znał zasady przetwarzania symboli wieloznacznych, sądzę, że mógłbym użyć polecenia RENAME bardziej efektywnie, bez konieczności uciekania się do partii tak często. Oczywiście znajomość zasad byłaby również korzystna dla rozwoju partii.
(Tak - w tym przypadku wysyłam sparowane pytanie i odpowiedź. Zmęczyło mnie to, że nie znałem zasad, i postanowiłem samodzielnie eksperymentować. Myślę, że wielu innych może być zainteresowanych tym, co odkryłem)
źródło
*
, tak jak Windows. Ma to ogromne konsekwencje. Chciałbym jednak wiedzieć o tej stronie; mogło to ułatwić moje dochodzenie. Reguły MSDOS7 różnią się znacznie od starych reguł DOS przed długimi nazwami plików i są krokiem w kierunku, w jaki system Windows je obsługuje. Znalazłem reguły DOS dotyczące długich nazw plików i były one bezwartościowe dla mojego dochodzenia.Odpowiedzi:
Reguły te zostały odkryte po szeroko zakrojonych testach na komputerze z systemem Vista. Nie przeprowadzono testów z użyciem Unicode w nazwach plików.
RENAME wymaga 2 parametrów - maska SourceMask, a następnie maska docelowa. Zarówno sourceMask, jak i targetMask mogą zawierać
*
i / lub?
symbole wieloznaczne. Zachowanie symboli wieloznacznych zmienia się nieznacznie między maskami źródłowymi i docelowymi.Uwaga - REN może być użyte do zmiany nazwy folderu, ale symbole wieloznaczne nie są dozwolone ani w sourceMask ani targetMask podczas zmiany nazwy folderu. Jeśli sourceMask pasuje do co najmniej jednego pliku, wówczas nazwa pliku zostanie zmieniona, a foldery zostaną zignorowane. Jeśli sourceMask pasuje tylko do folderów, a nie do plików, generowany jest błąd składniowy, jeśli symbole wieloznaczne pojawiają się w źródle lub celu. Jeśli sourceMask nic nie pasuje, wówczas pojawia się błąd „nie znaleziono pliku”.
Ponadto podczas zmiany nazw plików symbole wieloznaczne są dozwolone tylko w części nazwy pliku sourceMask. Symbole wieloznaczne nie są dozwolone w ścieżce prowadzącej do nazwy pliku.
sourceMask
SourceMask działa jako filtr do określania, które nazwy plików mają zostać zmienione. Symbole wieloznaczne działają tutaj tak samo, jak w przypadku każdego innego polecenia filtrującego nazwy plików.
?
- Odpowiada dowolnemu znakowi 0 lub 1 oprócz.
tej wieloznacznej jest zachłanny - zawsze zużywa następny znak, jeśli nie jest nim..
Jednak nie pasuje do niczego bez niepowodzenia, jeśli na końcu nazwy lub jeśli następny znak jest.
*
- Dopasowuje dowolne 0 lub więcej znaków, w tym.
(z jednym wyjątkiem poniżej). Ten symbol wieloznaczny nie jest zachłanny. Będzie pasować tak mało lub tyle, ile jest potrzebne, aby umożliwić dopasowanie kolejnych znaków.Wszystkie znaki niebędące symbolami wieloznacznymi muszą pasować do siebie, z kilkoma wyjątkami wyjątków.
.
- Pasuje do siebie lub może pasować do końca nazwy (nic), jeśli nie ma już więcej znaków. (Uwaga - poprawna nazwa systemu Windows nie może kończyć się na.
){space}
- Pasuje do siebie lub może pasować do końca nazwy (nic), jeśli nie ma już więcej znaków. (Uwaga - poprawna nazwa systemu Windows nie może kończyć się na{space}
)*.
na końcu - Dopasowuje dowolne 0 lub więcej znaków z wyjątkiem.
Terminacji.
może być dowolną kombinacją.
i{space}
tak długo, jak ostatni znak w masce to.
Jest to jedyny wyjątek, w którym*
po prostu nie pasuje do żadnego zestawu znaków.Powyższe zasady nie są tak skomplikowane. Ale jest jeszcze jedna bardzo ważna zasada, która sprawia, że sytuacja jest myląca: maska SourceMask jest porównywana zarówno z długą, jak i krótką nazwą 8.3 (jeśli istnieje). Ta ostatnia reguła może sprawić, że interpretacja wyników będzie bardzo trudna, ponieważ nie zawsze jest oczywiste, kiedy maska dopasowuje się za pomocą krótkiej nazwy.
Można użyć RegEdit, aby wyłączyć generowanie krótkich nazw 8.3 na woluminach NTFS, w którym to momencie interpretacja wyników maski pliku jest znacznie prostsza. Wszelkie krótkie nazwy, które zostały wygenerowane przed wyłączeniem krótkich nazw, pozostaną.
targetMask
Uwaga - nie przeprowadziłem żadnych rygorystycznych testów, ale wydaje się, że te same reguły działają również w przypadku nazwy docelowej polecenia COPY
TargMask określa nową nazwę. Jest zawsze stosowane do pełnej długiej nazwy; TargMask nigdy nie jest stosowany do krótkiej nazwy 8.3, nawet jeśli sourceMask pasuje do krótkiej nazwy 8.3.
Obecność lub brak symboli wieloznacznych w masce źródłowej nie ma wpływu na sposób przetwarzania symboli wieloznacznych w masce docelowej.
W poniższej dyskusji -
c
oznacza dowolny znak, który nie jest*
,?
lub.
Maska target jest przetwarzana względem nazwy źródła ściśle od lewej do prawej bez śledzenia wstecznego.
c
- Przesuwa pozycję w obrębie nazwy źródłowej, o ile następny znak nie jest,.
i dołączac
do nazwy docelowej. (Zastępuje znak, który był w źródlec
, ale nigdy nie zastępuje.
)?
- Dopasowuje następny znak z długiej nazwy źródłowej i dołącza go do nazwy docelowej, dopóki następny znak nie jest..
Jeśli następny znak jest.
lub jeśli na końcu nazwy źródłowej, żaden wynik nie jest dodawany do wyniku, a bieżący pozycja w nazwie źródła pozostaje niezmieniona.*
na końcu celu - Maskuje wszystkie pozostałe postacie ze źródła do celu. Jeśli już na końcu źródła, nic nie robi.*c
- Dopasowuje wszystkie znaki źródłowe od bieżącej pozycji do ostatniego wystąpieniac
(chciwe dopasowanie z rozróżnianiem wielkości liter) i dołącza dopasowany zestaw znaków do nazwy docelowej. Jeślic
nie zostanie znaleziony, wówczas dołączane są wszystkie pozostałe znaki ze źródła, a następniec
Jest to jedyna znana mi sytuacja, w której dopasowanie wzorca pliku Windows rozróżnia małe i wielkie litery.*.
- Dopasowuje wszystkie znaki źródłowe od bieżącej pozycji do ostatniego wystąpienia.
(chciwe dopasowanie) i dołącza dopasowany zestaw znaków do nazwy docelowej. Jeśli.
nie zostanie znaleziony, wszystkie pozostałe znaki ze źródła zostaną dodane, a następnie.
*?
- Dołącza wszystkie pozostałe postacie ze źródła do celu. Jeśli jest już na końcu źródła, nic nie robi..
bez*
naprzeciwko - Advances pozycję w źródle poprzez pierwszym wystąpieniu o.
nie kopiowanie jakichkolwiek znaków, i dołącza.
do nazwy docelowej. Jeśli.
nie znaleziono go w źródle, następuje przejście do końca źródła i dopisanie.
do nazwy celu.Po wyczerpaniu docelowej maski, wszelkie końcowe
.
i{space}
są przycinane na końcu wynikowej nazwy docelowej, ponieważ nazwy plików systemu Windows nie mogą kończyć się na.
lub{space}
Kilka praktycznych przykładów
Zastąp znak na 1. i 3. pozycji przed dowolnym rozszerzeniem (dodaje 2 lub 3 znak, jeśli jeszcze nie istnieje)
Zmień (ostateczne) rozszerzenie każdego pliku
Dołącz rozszerzenie do każdego pliku
Usuń dodatkowe rozszerzenie po początkowym rozszerzeniu. Należy pamiętać, że
?
należy zachować odpowiednią wartość, aby zachować pełną istniejącą nazwę i początkowe rozszerzenie.To samo co powyżej, ale odfiltruj pliki o początkowej nazwie i / lub rozszerzeniu dłuższym niż 5 znaków, aby nie zostały obcięte. (Oczywiście można dodać dodatkowy
?
na każdym końcu targetMask, aby zachować nazwy i rozszerzenia o długości do 6 znaków)Zmień znaki po
_
nazwisku i spróbuj zachować rozszerzenie. (Nie działa poprawnie, jeśli_
pojawia się w rozszerzeniu)Każda nazwa może być podzielona na komponenty, które są rozdzielane znakami.
.
Można je dodawać lub usuwać tylko na końcu każdego komponentu. Znaków nie można usuwać ani dodawać na początku lub w środku komponentu, zachowując pozostałą część za pomocą symboli wieloznacznych. Zastępstwa są dozwolone w dowolnym miejscu.Jeśli włączone są krótkie nazwy, wówczas maska SourceMask z co najmniej 8
?
dla nazwy i co najmniej 3?
dla rozszerzenia będzie pasować do wszystkich plików, ponieważ zawsze będzie pasować do krótkiej nazwy 8.3.Przydatne dziwactwo / błąd? do usuwania prefiksów nazw
W tym poście o SuperUser opisano, jak można użyć zestawu ukośników (
/
), aby usunąć wiodące znaki z nazwy pliku. Jeden znak ukośnika jest wymagany do usunięcia każdego znaku. Potwierdziłem zachowanie na komputerze z systemem Windows 10.Ta technika działa tylko wtedy, gdy zarówno maska źródłowa, jak i docelowa są ujęte w podwójne cudzysłowy. Wszystkie poniższe formularze bez wymaganych cytatów kończą się błędem:
The syntax of the command is incorrect
Nie
/
można go użyć do usunięcia jakichkolwiek znaków na środku lub na końcu nazwy pliku. Może usuwać tylko wiodące (przedrostki) znaki.Technicznie
/
nie działa jak symbol wieloznaczny. Raczej wykonuje prostą zamianę znaków, ale następnie po zamianie komenda REN rozpoznaje, że/
nie jest poprawna w nazwie pliku, i usuwa z niej wiodące/
ukośniki. REN podaje błąd składniowy, jeśli wykryje/
w środku nazwy celu.Możliwy błąd RENAME - pojedyncze polecenie może zmienić nazwę tego samego pliku dwa razy!
Począwszy od pustego folderu testowego:
Wierzę, że sourceMask
*1*
najpierw pasuje do długiej nazwy pliku, a nazwa pliku zmienia się na oczekiwany wynik223456789.123.x
. RENAME następnie szuka dalszych plików do przetworzenia i znajduje nowo nazwany plik za pomocą nowej krótkiej nazwy223456~1.X
. Nazwa pliku jest następnie ponownie zmieniana, co daje końcowy wynik223456789.123.xx
.Jeśli wyłączę generowanie nazw 8.3, to RENAME daje oczekiwany wynik.
Nie w pełni opracowałem wszystkie warunki wyzwalające, które muszą istnieć, aby wywołać to dziwne zachowanie. Martwiłem się, że może być możliwe utworzenie niekończącej się rekurencyjnej RENAME, ale nigdy nie byłem w stanie jej wywołać.
Uważam, że wszystkie poniższe warunki muszą być prawdziwe, aby wywołać błąd. Każda skrzynka, którą widziałem, miała następujące warunki, ale nie wszystkie skrzynki, które spełniały następujące warunki, były błędne.
źródło
REN /?
.Copy of
prefiks, używając niejasnej techniki slash do przodu:ren "Copy of *.txt" "////////*"
Podobnie jak exebook, oto implementacja C #, aby uzyskać docelową nazwę pliku z pliku źródłowego.
Znalazłem 1 mały błąd w przykładach dbenham:
Oto kod:
A oto metoda testowa NUnit do testowania przykładów:
źródło
Może ktoś może uznać to za przydatne. Ten kod JavaScript oparty jest na odpowiedzi autorstwa dbenham powyżej.
Nie testowałem
sourceMask
zbyt wiele, aletargetMask
pasuje do wszystkich przykładów podanych przez dbenham.źródło
Udało mi się napisać ten kod w języku BASIC, aby zamaskować nazwy plików symboli wieloznacznych:
źródło