проверять соответствующие элементы в массивах в powershell - PullRequest
0 голосов
/ 02 июля 2019

У меня есть два массива с тремя элементами (части имени файла) каждый. Мне нужно объединить первый элемент первого массива и первый элемент второго массива и проверить, не является ли оно нулевым, и если комбинация (имя файла) существует и, как и в других случаях, мне нужно сделать это для двух других элементов таким же образом.

$file_nameone_array = ( table, chair, comp)
$file_nametwo_array = ( top, leg , cpu)
foreach ($input_file in $file_nameone_array) {
foreach ($input_rev in $file_nametwo_array) {
$path = "D:\$input_file-$input_rev.txt"
    If (test-path $path -pathtype leaf) {
        write-host "$path exists and not null"}
    else{ 
        write-host "$path doesnot exist"
        exit 1}

Я ожидаю проверить «table-top.txt», «chair-leg.txt», «comp-cpu.txt» тогда как мой код проверяет «table-leg.txt» и завершает работу, говоря, что table-leg.txt не существует.

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

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

  • Ваши элементы массива должны быть заключены в кавычки.
  • Используйте Write-Output $path, чтобы увидеть, что вы на самом деле проверяете.
  • Используйте обычную for петлю
  • Это синтаксис для записи вывода первого элемента в массиве: Write-Output "$($file_nameone_array[0])"

Надеюсь, вы сможете получить этот ответ от этого.

0 голосов
/ 02 июля 2019

Если вы слегка измените свой пример, чтобы просто отобразить переменную $ path, вот так:

$file_nameone_array = @( "table", "chair", "comp" )
$file_nametwo_array = @( "top", "leg" , "cpu" )
foreach ($input_file in $file_nameone_array) {
    foreach ($input_rev in $file_nametwo_array) {
        $path = "D:\$input_file-$input_rev.txt"
        write-host $path
    }
}

вы получите этот вывод

D:\table-top.txt
D:\table-leg.txt
D:\table-cpu.txt
D:\chair-top.txt
D:\chair-leg.txt
D:\chair-cpu.txt
D:\comp-top.txt
D:\comp-leg.txt
D:\comp-cpu.txt

, чтобы вы могли понять, почему он ищет "D: \ table-top.txt "в качестве первого файла.

что вы можете сделать вместо этого:

$file_nameone_array = @( "table", "chair", "comp" )
$file_nametwo_array = @( "top", "leg" , "cpu" )
for( $index = 0; $index -lt $file_nameone_array.Length; $index++ ) {
    $input_file = $file_nameone_array[$index];
    $input_rev  = $file_nametwo_array[$index];
    $path       = "D:\$input_file-$input_rev.txt"
    write-host $path
}

и теперь вы получите этот вывод

D:\table-top.txt
D:\chair-leg.txt
D:\comp-cpu.txt

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

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

0 голосов
/ 02 июля 2019

Вы можете попробовать так:

$file_nameone_array = ( "table","chair", "comp") # INITILIZING ARRAY
$file_nametwo_array = ( "top", "leg", "cpu") # INITILIZING ARRAY

if ($file_nameone_array.Count -ne $file_nametwo_array.Count )  # CPMPARING BOTH ARRAY'S SIZE
{
    Write-Error "Both array must have same size..." # THROW ERROR
    exit # EXIT
}

for($ind = 0 ; $ind -lt $file_nameone_array.Count ; $ind++) # FOR LOOP 0 TO ARRAY'S LENGTH - 1
{
    $path = "D:\\" + $file_nameone_array[$ind] + "-" + $file_nametwo_array[$ind] + ".txt" # COMBINING BOTH ELEMENTS
    If (test-path $path -pathtype leaf) # CHECKING PATH EXIST OR NOT
    {
        write-host "$path exists and not null" # PRINT PATH EXIST
    } # END OF IF
    else # ELSE 
    {
        Write-Error "$path doesnot exist" # THROW ERROR : FILE NOT EXIST
        exit 1 # EXIT SCRIPT
    } # END OF ELSE

} # END OF FOR LOOP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...