Użyj test-path z powershell do sprawdzenia czy plik istnieje

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”:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *