1

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

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 是否为假时,它不会移动任何东西。当我单独运行函数中的代码时,一切正常。将它们作为功能放在一起,它不起作用。我不想创建一个单独的 function.ps1 来调用,我宁愿从代码中调用我的函数。谢谢!

4

2 回答 2

1

FUNC1如果$searchFiles其中有两个或多个文件名,将返回一个(布尔值)数组。

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

您的方法似乎很奇怪,执行所有测试,然后移动测试显示该文件的任何内容。我本来期望像这样的:

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

它将遍历 中的所有行$source,忽略目标位置存在该名称的文件并将文件移动到目标位置的情况。

于 2012-11-01T14:33:22.290 回答
0

您的语法令人困惑,“!(FUNC1)”将始终为$ false。FUNC1 的结果是一个变量(数组类型),而不是 $null,将被视为 true,因此 !(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
        } 
    }
}
于 2012-11-01T14:41:39.107 回答