【问题标题】:Powershell: Why doesn't this function work?Powershell:为什么这个功能不起作用?
【发布时间】:2018-11-04 04:00:00
【问题描述】:

我正在尝试制作一个布局整齐的函数来比较两个文件夹项的脚本。程序:

  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}
}     

但这不是:

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) 的事情来传递变量(?)。

【问题讨论】:

  • 我立即看到的一个问题是您在调用函数之后定义了函数。你需要在powershell中按顺序做事。
  • 你在使用powershell ISE吗?
  • 是的,我正在使用 ISE。另外我不在 PowerShell 要求您先调用然后定义。我已经改变了这一点,但谁能解释为什么它仍然能够运行这些功能,尽管做了相反的事情?
  • 请允许我给你一个标准的建议给新手:如果一个答案解决了你的问题,请点击它旁边的大复选标记 (✓) 接受它,也可以选择给它投票(up - 投票需要 15 个或更多声望点)。如果您发现其他答案有帮助,请给他们投票。接受(您将获得 2 个声望点)和投票可以帮助未来的读者。请参阅the relevant help-center article。如果您的问题尚未得到完全解答,请提供反馈或self-answer

标签: function powershell powershell-3.0


【解决方案1】:

$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

这就是您修改后的代码的样子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多