W tym małym artykule opisuję jak użyć cmdlet Test-Path do sprawdzenia czy plik istnieje – jak również alternatywę .NET, którą współpracownik musiał kiedyś użyć w jakimś kontekście SCOM. Wpisz Get-Help Test-Path aby uzyskać więcej informacji, ewentualnie z przełącznikiem „-online”. Demonstruję także szybko metodę Exists() klasy .NET z klasy System.IO.File.
Demonstruję także, jak utworzyć nowy plik, jeśli taki nie istnieje, i pokażę, jak radzić sobie z niepowodzeniami w tworzeniu pliku z wdziękiem.
Oficjalna dokumentacja Microsoftu jest tutaj, pod tym linkiem.
Tweet
How To Check If A File Exists With PowerShell
Możesz użyć czegoś takiego do weryfikacji w wierszu poleceń:
PS C:\> Test-Path C:\WindowsTrue
Uważaj, że potrzebujesz cudzysłowów, jeśli ścieżka zawiera spacje, nawiasy – i prawdopodobnie inne znaki, których nie mogę teraz wymyślić. PowerShell automatycznie dodaje cudzysłowy, gdy tabulator jest uzupełniany. Zalecam używanie pojedynczych cudzysłowów, ponieważ podwójne cudzysłowy „rozszerzają” zmienne (głównie istotne, jeśli masz „$” w ścieżce).
PS C:\> Test-Path -Path 'C:\Program Files'True
W przeciwnym razie zobaczysz coś takiego:
PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.
Aby jednoznacznie upewnić się, że jest to plik, a nie katalog, użyj parametru -PathType, który ma następujące możliwe wartości:
- Any
- Leaf (plik)
- Container (katalog/folder)
Przykładowy zrzut ekranu
Użycie skryptu
W skrypcie, typowo używałbyś tego w instrukcji if. Aby zanegować i sprawdzić, czy folder lub plik nie istnieje, użyj „!” lub „-not”, i pamiętaj, aby zawrzeć instrukcję Test-Path w nawiasach.
Pamiętaj również, że jeśli ścieżka lub nazwa pliku zawiera spację, musisz otoczyć całą ścieżkę cudzysłowem. Pojedyncze cudzysłowy lub podwójne cudzysłowy będą działać tak samo, jeśli nie ma żadnych „rozszerzalnych” części w ścieżce lub nazwie pliku, ale nieco bezpieczniejszym wyborem jest pojedynczy cudzysłów. Jest to domyślne ustawienie PowerShella, gdy autouzupełniasz nazwy z tabulatorem w znaku zachęty.
Powinieneś także być świadomy różnicy pomiędzy -Path i -LiteralPath. Ta ostatnia potraktuje ścieżkę dosłownie, jak wskazuje jej nazwa, podczas gdy pierwsza obsługuje składnię wieloznaczną. Jest to często odkrywane przez przypadek, gdy ktoś natknie się na plik z nierównymi nawiasami, ponieważ jest to część tej samej składni, której używa -like, jak w przypadku jednej cyfry heksadecymalnej. To spowoduje komunikaty o błędach, przynajmniej na wcześniejszych wersjach PowerShell, podczas używania -Path. Podczas listowania struktur katalogów z jednego katalogu głównego, użyj -LiteralPath. I o ile nie potrzebujesz obsługi symboli wieloznacznych, jest to bezpieczniejszy wybór.
Tworzenie pliku, jeśli nie istnieje
Możesz użyć cmdletu Set-Content, aby utworzyć nowy plik, jeśli aktualnie nie istnieje.
Poznaj moje przykłady i Get-Help Set-Content lub Microsoft Docs online tutaj pod tym linkiem.
Możesz również użyć Out-File i innych metod, których nie będę tutaj opisywał.
Oczywiście możesz użyć $Variable z nazwą pliku w miejsce twardo zakodowanego tekstu.
To po prostu tworzy plik z pustym ciągiem znaków jako jego zawartością.
Albo możesz to zrobić w ten sposób, jeśli pracujesz w linii poleceń lub jeśli odpowiada to twojej fantazji:
"" | Set-Content x:\path\filenamehere.xml
Pomyślałem, że dobrze jest zademonstrować to, co jest prawdopodobnie uważane za najbardziej poprawny sposób użycia skryptu.
Jeśli chcesz przetestować niepowodzenia w tworzeniu pliku, możesz użyć instrukcji try {} catch {} wraz z parametrem i wartością „-ErrorAction Stop” do cmdleta tworzącego plik, np.np. Set-Content lub Out-File.
Tutaj szybki przykład:
Widząc często się wierzy (czasami niesłusznie, ale to już inna historia), więc oto zrzut ekranu z PowerShell ISE uruchamiający ten przykład zapisany w pliku skryptowym .ps1.
Wyliczanie możliwych wartości PathType
Małą „sztuczką”, aby zobaczyć możliwe wartości wyliczeniowe dla -PathType jest użycie takiej, która nie istnieje, jak ta:
I zauważamy część, w której jest napisane:
The possible enumeration values are "Any, Container, Leaf".
Using The .NET System.IO.File Class Method „Exists”
Możesz również użyć metody Exists() z klasy .NET System.IO.File:
PS E:\temp> ::Exists('E:\temp\csv1.csv')True
W PowerShell, przestrzeń nazw „System” jest opcjonalna, więc możesz po prostu użyć „Io.File”, jak również.
Jedną rzeczą, o której należy pamiętać, jest to, że w tej metodzie potrzebujesz pełnej ścieżki. Aby sprawdzić, czy plik znajduje się w bieżącym katalogu za pomocą metody IO.File Exists(), możesz użyć czegoś takiego, gdzie zazwyczaj używałbyś zmiennej z nazwą pliku w miejsce zakodowanego tutaj „test.ps1”: