Powershell: почему эта функция не работает? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь сделать скрипт с аккуратно выложенными функциями, которые сравнивают две папки.Программа:

  1. Запрашивает у пользователя путь к файлу
  2. Проверьте, не отличаются ли имена файлов
  3. Проверьте, не отличаются ли размеры файлов

В качестве теста я сравнивал одну и ту же папку с самой собой (вывод должен быть false, false).При выполнении шага 1 ($referencepath) как функции (FolderPrompt) моя программа не работает правильно, и под этим я подразумеваю, что я получаю разные ответы почти каждый раз, когда запускаю ее.

Это работает:

$referencePath = Read-Host -Prompt "Enter new DTNA folder path to check" 

NameDisc
SizeDisc

function NameDisc {
    write-host "Name Discrepancy: " -NoNewline 

    if (Compare-Object -Property name (Get-ChildItem $referencePath) - DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}

function SizeDisc {
    write-host "Size Discrepancy: " -NoNewline 

    if (Compare-Object -Property length (Get-ChildItem $referencePath) - DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}     

Но это не так:

FolderPrompt
NameDisc
SizeDisc

function FolderPrompt {
    $referencePath = Read-Host -Prompt "Enter new DTNA folder path to check" 
}

function NameDisc {
    write-host "Name Discrepancy: " -NoNewline 

    if (Compare-Object -Property name (Get-ChildItem $referencePath) -DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}

function SizeDisc {
    write-host "Size Discrepancy: " -NoNewline

    if (Compare-Object -Property length (Get-ChildItem $referencePath) - DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}     

Я пробовал:

  • Объявление функций перед их вызовом

  • Установка $referencePath = 0 для сброса значения каждый раз, считая, что это проблема

  • Помещение Return $referencePath в конце различных функций

Мое лучшее предположение, что мне нужно сделать что-то вроде function <name> ($referencePath), чтобы передать переменную (?).

1 Ответ

0 голосов
/ 24 мая 2018

$referencepath становится локальным для функции после того, как вы ее назначаете, поэтому ее значение теряется, так как вы его не возвращаете.Вы говорите, что пытались вернуть его в «различных функциях», но не ясно, как это выглядело.

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

При вызове функций в PowerShell не используйте скобки и запятые для параметров, используйте пробелы.

function FolderPrompt {
    Read-Host -Prompt "Enter new DTNA folder path to check" 
}

function NameDisc { 
param($referencePath)

    write-host "Name Discrepancy: " -NoNewline 

    if (Compare-Object -Property name (Get-ChildItem $referencePath) -DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}

function SizeDisc {
param($referencePath)

    write-host "Size Discrepancy: " -NoNewline

    if (Compare-Object -Property length (Get-ChildItem $referencePath) - DifferenceObject (Get-ChildItem P:\DTNA_201805081923))
        {return $true} 
    else
        {return $false}
}     

$refPath = FolderPrompt
NameDisc -referencePath $refPath
SizeDisc -referencePath $refPath

Вот как вашмодифицированный код будет выглядеть.

...