проверка powershell на наличие нескольких входных данных

#powershell #input #file-exists

#powershell #ввод #файл-существует

Вопрос:

Мне нужно проверить, существуют ли файлы из входных данных.

  1. Я разделяю несколько входных данных, например, BWMDL.VML BWMDL.STA и т.д., И записываю файлы, которые уже находятся в папке
  2. Я проверяю, присутствуют ли файлы из входных данных в папке или нет.

Но я получаю True, даже если файл не существует, также вывод из test-path печатается дважды с разным результатом.

 Set-Variable -Name Files -Value (Read-Host "instert file name") 
Set-Variable -Name FromPath -Value ("C:UsersDesktopAPAPparser*.VML" , "C:UsersDesktopAPAPparser*.STA")
Set-Variable -Name NameOfFiles (Get-ChildItem -Path $FromPath "-Include *.VML, *.STA" -Name)

Write-Host "FILES IN FOLDER:"
$NameOfFiles

Write-host "---------------------"
Write-host "FILES FROM INPUT: "
Splitted
Write-host "---------------------"

Write-host "FILE EXISTS: "
ForEach ($i in Splitted) {
    FileToCheck
}

function Splitted {
    $Files -Split " "
}

function FileToCheck {
    Test-Path $FromPath -Filter $Files -PathType Leaf
}
  

Например, я получаю такой результат

Ответ №1:

Вы слишком усложняете это.
Как только вы получите имена всех файлов с расширением.VML или .STA в массиве, вам больше не нужно использовать Test-Path , так как вы знаете, что файлы в массиве $NameOfFiles действительно существуют, иначе Get-ChildItem не перечислили бы их.

Это означает, что вы можете избавиться от определенных вами вспомогательных функций, которые, кстати, должны были быть написаны поверх вашего кода, поэтому перед их вызовом.

Попробуйте

 $Files    = (Read-Host "instert file name(s) separated by space characters" ) -split 's '
$FromPath = 'C:UsersDesktopAPAPparser'

# if you need to recurse through possible subfolders
$NameOfFiles = (Get-ChildItem -Path $FromPath -Include '*.VML', '*.STA' -File -Recurse).Name

# without recursion (so if files are directly in the FromPath):
# $NameOfFiles = (Get-ChildItem -Path $FromPath -File | Where-Object {$_.Extension -match '.(VML|STA)'}).Name

Write-Host "FILES IN FOLDER:"
$NameOfFiles

Write-host "---------------------"
Write-host "FILES FROM INPUT: "
$Files
Write-host "---------------------"

Write-host "FILE EXISTS: "
foreach ($file in $Files) { ($NameOfFiles -contains $file) }
  

Вывод должен выглядеть следующим образом

 instert file name(s) separated by space characters: BWMDL.VML BWMDL.STA
FILES IN FOLDER:
BWMDL.STA
BWMDL.VML
---------------------
FILES FROM INPUT: 
BWMDL.VML
BWMDL.STA
---------------------
FILE EXISTS: 
True
True