Dlaczego w Eksploratorze Windows możemy utworzyć folder lub plik z symbolem procentu (%), jeśli symbol procentu jest używany dla istniejących zmiennych?

13
  1. Przejdź do Eksploratora Windows i utwórz nazwany folder / katalog %systemdrive%, %windir%lub dowolna inna istniejąca zmienna.
  2. Otwórz wiersz polecenia i przejdź do właśnie utworzonego folderu.

Nie możesz, bo jest procent ( % ) symbole w nazwie folderu, mylące wiersz polecenia, ponieważ symbol procentu jest używany dla istniejących zmiennych.

Ucieczka z procentu ( % ) symbol z dwoma symbolami procentowymi ( %% ) nie działa, więc odpowiedź DavidPostill jest błędna:

Command prompt window, with a bit of the Explorer desktop showing Dlaczego w Eksploratorze Windows możemy utworzyć folder lub plik z procentem ( % ) symbol symbolu procentu jest używany dla istniejących zmiennych?

The Tech Guy
źródło

Odpowiedzi:

15

Dlaczego możemy utworzyć folder / plik z symbolem procentu?

The % znak nie jest znakiem zastrzeżonym w nazwie pliku.

Zastrzeżone znaki do nazywania plików, ścieżek i przestrzeni nazw to:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Źródło Nazwy plików, ścieżki i przestrzenie nazw


Symbol procentu jest zarezerwowany dla zmiennych

Teraz otwórz wiersz polecenia i spróbuj przejść do utworzonego folderu.

Nie możesz, ponieważ w nazwie folderu znajdują się symbole procentowe, co wskazuje, że jest to zmienna.

Powyższe nie jest prawdą. Wszystko działa zgodnie z oczekiwaniami.

Przykład użycia %test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Przykład użycia %systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

Uciekające procenty

The % znak ma specjalne znaczenie dla parametrów linii poleceń i FOR parametry.

Aby traktować procent jako zwykły znak, podwoj go:

%%

Źródło składnia


Dalsze czytanie

DavidPostill
źródło
1
Uwaga: nie wszystkie zarezerwowane znaki dotyczą systemu plików NTFS. Na przykład za pomocą Linuksa mogę łatwo utworzyć plik o nazwie <test>. Po prostu nie można tego zrobić za pomocą funkcji zarządzania plikami Windows.
Nathan Osman
2
@NathanOsman Możesz mieć możliwość tworzenia plików z tymi nazwami z poziomu systemu Windows przy użyciu surowej notacji bezwzględnej ścieżki ( \\?\C:\USERS\DEFAULT\<test> ).
zwol
@ Zwol oh? Nie wiedziałem tego. Dobrze wiedzieć.
Nathan Osman
@ Zwol nie od a cmd muszla ... F:\test>md \\?\f:\test\<test> Składnia polecenia jest niepoprawna.
DavidPostill
@DavidPostill O czym md \\^?\f:\test\^<test^> ?
zwol
11

Odpowiedź DavidPostill jest świetna, ale może trochę zmylić przybyszów. Spróbuję przeformułować.

% nie jest zarezerwowany postać.

To jest postać z specjalne znaczenie do powłoka polecenia (znany jako cmd.exe i command.com )

Różnica polega na:

  • nie można w ogóle używać znaków zastrzeżonych (ale patrz poniżej)
  • możesz używać specjalnych i uciekających znaków - po prostu nie wpisuj ich tak jak są

Innymi słowy, możesz utworzyć plik lub folder zawierający % w ich imieniu. Możesz to zrobić bezpośrednio za pomocą Eksploratora Windows, ponieważ % nie ma tam specjalnego znaczenia. Nie było też zamiaru uniemożliwić tworzenia takich plików w wierszu polecenia, ale ponieważ % ma tam specjalne znaczenie, musisz użyć składni opisanej poniżej, aby utworzyć takie pliki.

Pliki BAT

Jeśli jesteś pisanie pliku wsadowego ( % dosłownie (na przykład, aby utworzyć plik za pomocą % w nazwie, a nie do zastąpienia zmiennej lub parametru), musisz wpisać %% zamiast.

Na przykład,

  • dowództwo echo %windir% produkuje dane wyjściowe: c:\windows
  • jednak polecenie echo %%windir%% produkuje dane wyjściowe: %windir%
  • i tak dalej: polecenie echo %%%%windir%%%% produkuje dane wyjściowe: %%windir%%

Więc jeśli zapisujesz następującą linię jako test.bat i uruchom go, utworzy katalog o nazwie %test% wraz ze znakami procentu:

md %%test%%

Jeśli jest Nie zmienna o nazwie test, to następne polecenie jest równoważne z ostatnim - tworzy także katalog %test%:

md %test%

... ale proszę nigdy tego nie robić, ponieważ twoje polecenie nie zachowuje się tak, jak chciałeś, gdy ktoś stworzy zmienną o tej nazwie

Jeśli zamierzasz użyć polecenia for w pliku BAT musisz także podwoić % tak, aby miało to szczególne znaczenie for polecenie zamiast powłoki poleceń:

for %%i in (*.*) do echo %%i

Spowoduje to utworzenie listy plików w bieżącym katalogu (czyli %%i ma specjalne znaczenie) i nie jestem pewien, jak to zrobić, aby było dosłowne %%i bez uciekania się do %p% obejście opisane w następnej sekcji ( %%%%i nie działa tutaj).

% nie jest jedynym znakiem o specjalnym znaczeniu w wierszu polecenia. Inne obejmują ^, <, >, |, (, ), &, !, ". Większość z nich (wyłączając " ) może być uciekł - czyli poprzedzony znakiem ucieczki ^ tak, aby wstawić literalny znak, tłumiąc jego specjalne znaczenie. Te także tracą swoją specjalną funkcję w ciągu podwójnego ciągu i " ucieka z ukośnikiem odwrotnym: \". Trochę opieki ( ^ ) może wymagać podwojenia wewnątrz ciągu zamkniętego z podwójnymi cytatami i gdzie ma miejsce podstawienie zmiennej opóźnionej ( ! specjalne znaczenie).

Wiersz polecenia

Niestety, podczas wpisywania poleceń bezpośrednio w oknie wiersza polecenia, podwajanie % postać po prostu produkuje %% tj. powyższe podejście nie działa w tym przypadku.

Wydaje się, że istnieje obejście wykorzystujące dziwactwo w przetwarzaniu poleceń - można uzyskać dosłowne % wpisując ^ po %. Takie podejście nie jest jednak niezawodne: jeśli nazwa pliku jest ujęta w podwójne cudzysłowy, ^ jest interpretowane dosłownie (i nie jest usuwane jak bez cudzysłowów)

  • dowództwo echo %windir% produkuje dane wyjściowe: c:\windows
  • dowództwo echo %^windir% produkuje dane wyjściowe: %windir%
  • dowództwo echo "%^windir%" produkuje dane wyjściowe: "%^windir%" (z dodatkiem ^ - nie to, czego chcieliśmy)

Zamiast tego polecam inne obejście:

  • utwórz zmienną taką jak ta: set "p=%"
  • posługiwać się %p% gdziekolwiek potrzebujesz dosłownego znaku procentu: echo "%p%windir%p%" będzie teraz produkować dane wyjściowe: "%windir%"

To samo obejście może zostać wykorzystane do uzyskania dosłownego procentowego zalogowania for polecenie, jednak należy pamiętać, że w przeciwieństwie do plików BAT podczas wpisywania for polecenie bezpośrednio zrobić nie podwójne znaki procentu.

Zastrzeżone znaki systemu plików

Zwykle nie można utworzyć pliku lub katalogu zawierającego następujące zastrzeżone znaki w nazwie: / ? < > \ : * | ", Symbol NULL i znaki z kodami od 1 do 31; również . i przestrzeń nie może być ostatnimi postaciami; i następujące imiona są nielegalne: com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.

Jednak, trochę z tych ograniczeń można ominąć ścieżkę pliku poprzedzającego \\?\ lubię to: \\?\c:\test...\nul. W ten sposób można manipulować przynajmniej plikami z nazwami zastrzeżonymi i kończącymi się spacją i kropką.

Co więcej, sam system plików NTFS obsługuje kilka podsystemów nazewnictwa: DOS, Windows i POSIX. Jest to podsystem Windows, który ma wszystkie powyższe ograniczenia, podczas gdy POSIX zabrania tylko / i symbol NULL.

GNU / Linux OS (nadzbiór POSIX) może zatem tworzyć (i usuwać) nazwy plików / katalogów, z którymi większość normalnych funkcji Windows API (a zatem i programów Windows) nie może pracować. W systemie Windows XP praca z nimi była możliwa dzięki zainstalowaniu bezpłatnego „Usługi dla podsystemu Unix” (SFU); w systemie Vista i wyżej wymagane są do tego narzędzia innych firm. Nie jestem pewien, czy może to zrobić nowy podsystem ubuntu-on-windows10.

Jack White
źródło
Dlaczego używasz tagów klawiatury dla nazw ścieżek / poleceń? Byłoby to zarówno poprawniejsze składniowo, jak i bardziej czytelne, gdybyś użył formatowania kodu wbudowanego. Łatwiej byłoby również wpisać: backtick zamiast <kbd>.
Cody Gray
Gotowe. Myślałem, że & lt; kbd & gt; tagi & lt; / kbd & gt; miał znacznie wyraźniejszy zarys niż code blocks. Ale jeśli pojawi się takie pytanie, myślę, że powodują zamieszanie.
Jack White
2
„To symbol ucieczki powłoki poleceń” Niepoprawne. Znakiem ucieczki w cmd jest ^. % jest „znakiem, który ma specjalne znaczenie dla parametrów linii poleceń i parametrów FOR. Aby traktować procent jako zwykły znak, podwoj go”.
DavidPostill
Rzeczywiście, miałem pomieszane terminy. Teraz poprawiłem odpowiedź. Dzięki.
Jack White
Zwróć też uwagę, jak zaznaczono w mojej odpowiedzi, podwajasz tylko % w for Jeśli to for znajduje się w pliku wsadowym. Pisanie na maszynie for %%i in (*) do echo %%i w oknie wiersza polecenia powoduje błąd, podając niewłaściwy wygląd %%i.
Jack White