我正在尝试使用整齐排列的函数制作一个脚本,比较两个文件夹项。该计划:
作为测试,我一直在将相同的文件夹与自身进行比较(输出应为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)
这样的事情来传递变量(?)。
答案 0 :(得分: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
这就是修改后的代码的外观。