如何创建一个函数并在同一个脚本中调用它

时间:2012-11-01 14:25:05

标签: powershell powershell-v2.0

我需要帮助在脚本中创建一个函数,并在调用该函数的同一个脚本中。我测试了这段代码:

function FUNC1() {
$source="C:\Folder\file.txt"
$destination="\\Server\folder"
$searchFiles = Get-Content "$source"
foreach($filename in $searchFiles){ 
    Test-Path $destination\$filename 
    }
}

function FUNC2() {
$source="C:\Folder\file.txt"
$destination="\\Server\folder"
$searchFiles = Get-Content "$source"
foreach($filename in $searchFiles){ 
    Move-Item C:\folder\$filename $destination -force
    }
}

if (!(FUNC1)) {FUNC2}

但是,当测试FUNC1为false时,它不会移动任何东西。当我单独运行函数中的代码时,一切正常。把它们放在一起作为功能,它不起作用。我不想创建一个单独的function.ps1来调用,我宁愿在代码中调用我的函数。谢谢!

2 个答案:

答案 0 :(得分:1)

如果FUNC1中有两个或更多文件名,

$searchFiles将返回一个数组(布尔值)。

这总是正确的,即使它只包含多个$false值(因为您正在测试数组,而不是它包含的值)。否定此内容(!)将始终为$false,因此永远不会执行if的内容。

你的方法看起来很奇怪,在那里执行所有测试,然后移动任何测试显示的文件。我原以为是这样的:

Get-Content "$source" | 
  Where-Object { -not (Test-Path $destination\$_) } |
  Foreach-Object { Move-Item C:\folder\$_ $destination }

将迭代$source中的所有行,忽略目标中存在该文件的文件并将文件移动到目的地的情况。

答案 1 :(得分:0)

你的语法令人困惑,“!(FUNC1)”将永远是$ false。 FUNC1的结果是可变的(数组类型),而不是$ null,将被视为真,所以!(FUNC1)将是$ false。您可以将这两个函数合并为一个:

function FUNC1() {
    $source="C:\Folder\file.txt"
    $destination="\\Server\folder"

    $searchFiles = Get-Content "$source"
    foreach($filename in $searchFiles){ 
        if(-not (Test-Path $destination\$filename))
        {
            Move-Item C:\folder\$filename $destination -force
        } 
    }
}