Powershell:为什么这个功能不起作用?

Rya*_*yan 2 powershell function powershell-3.0

我正在尝试制作一个脚本,其中包含比较两个文件夹项目的整齐布局的功能.该程序:

  1. 提示用户输入文件路径
  2. 检查文件名是否不同
  3. 检查文件大小是否不同

作为测试我一直在比较相同的文件夹本身(输出应该是假,假).在制作步骤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}
}     
Run Code Online (Sandbox Code Playgroud)

但这不是:

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}
}     
Run Code Online (Sandbox Code Playgroud)

我试过了:

  • 在调用函数之前声明函数

  • $referencePath = 0每次重置价值以为是问题

  • 放在Return $referencePath不同功能的最后

我最好的猜测是我需要做一些事情function <name> ($referencePath)来传递变量(?).

bri*_*ist 5

$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
Run Code Online (Sandbox Code Playgroud)

这就是修改后的代码的外观.