Jak sprawdzić czy katalog istnieje w Windows?
Chciałbym przetłumaczyć ten skrypt Linux/Bash na powłokę Windows:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Testuje on czy katalog istnieje, a jeśli nie, to go tworzy.
Chciałbym przetłumaczyć ten skrypt Linux/Bash na powłokę Windows:
if test -d myDirName; then echo "ok"; else mkdir myDirName; fi
Testuje on czy katalog istnieje, a jeśli nie, to go tworzy.
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Dodany przez Barlopa
Podczas gdy powyższe działa dla tej konkretnej sytuacji, tytuł mówi o testowaniu specjalnie dla katalogu. Komentarz Phogga używający if exist mydirname
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
`
Dodany przez Barlopa
Podczas gdy powyższe działa dla tej konkretnej sytuacji, tytuł mówi o testowaniu specjalnie dla katalogu. Komentarz Phogga używający zamiast if exist mydirname
jest sposobem. Niektóre odpowiedzi użyły \nul, ale \nul jest problematyczne w NT. Nie wliczając wstecznego ukośnika (trailing backslash) testuje się dla pliku lub katalogu. Tak więc, w przypadku katalogu, należy dołączyć śledzący odwrotny ukośnik.
Oto, czego właśnie się dowiedziałem:
Możesz sprawdzić, czy plik nul istnieje; jeśli katalog istnieje, to będzie zawierał plik nul, jeśli plik nul nie istnieje to katalog nie istnieje.
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Użyj odwrotnego ukośnika, nie ukośnika do przodu: myDirName\nul
nie myDirName/nul
md foo
echo.>bar
for %I in (foo bar xyz) do @(
if exist %I (
if exist %I\nul (
echo -- %I is a directory
) else (
echo -- %I is a file
)
) else (
echo -- %I does not exist
)
)
– foo to katalog – pasek to plik – xyz nie istnieje
edit: to działa tylko wtedy, gdy nazwa katalogu nie zawiera spacji
Niektórzy sugerowali, że nie, ale to nie działa niezawodnie w NT
C:\blah>md abc
C:\blah>if exist abc\nul echo yes
yes
C:\blah>if exist "abc\nul" echo yes
C:\blah>
http://www.dostips.com/forum/viewtopic.php?f=3&t=4913
foxidrive writes-
The trick with nul worked in pre NT versions of windows.
Now you would use this, with a trailing backslash.
if exist "C:\abcde\" echo the folder exists
W odpowiedzi na pytanie
C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no
C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes
C:\blah>
Zastanawiałem się, dlaczego joe miał głosy odrzucające, ponieważ doświadczałem tego samego rodzaju problemu na Windows 7, a mianowicie, że
JEŚLI WYSTAWAJE nazwa pliku \NULACJA
był powrót Prawda dla obu plików i katalogów. Znalazłem alternatywne rozwiązanie na stronie www.robvanderwoude.com/battech\_ifexistfolder.php i wymyśliłem poprawioną wersję pętli FOR DVF:
FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )
Widzę, że wiele osób ma problemy z rozróżnieniem pomiędzy plikami i folderami. Czy ktoś próbował po prostu wejść do niego po sprawdzeniu, że istnieje? Wtedy cd albo się powiedzie, albo zawiedzie.
set MyDir = "MyTestDir"
IF exist MyDir (
cd MyDir
IF ERRORLEVEL NEQ 0 (
echo "Error: %MyDir% already exists, but it is a file!"
exit 1
) else (
# Do not forget to cd back
cd ..
)
) else (
# Did not exist yet, so create it.
mkdir MyDir
)
Wolę używać dir /d | findstr \[\.\.\]
:
2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName&&echo= Is NOT dir
2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName
Do tworzenia, jeśli istnieje lub nie oraz do ignorowania błędu…
2>nul mkDir myDirName
Również …
if exist "myDirName\." (echo/"ok") else mkdir myDirName
rem :: or direct create myDirName hidden/ignoring error
2>nul mkdir myDirName & if exist "myDirName\." echo/ exist
rem :: output: exist
Znalezienie folderu nie powinno być takie trudne. Moje rozwiązanie, użyj perla:
for($cnt=$#ARGV; $cnt\>=0; --$cnt) { if ( -d "$ARGV[$cnt]" ) { print "argv[$cnt]=$ARGV[$cnt] is a folder\n"; $dir = $ARGV[$cnt]; break; } else { print "argv[$cnt]=$ARGV[$cnt] is Not a folder\n"; } }