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 の false をテストすると、何も動きません。関数内のコードを個別に実行すると、すべてが正常に機能します。それらを関数としてまとめると、機能しません。呼び出す別の function.ps1 を作成したくありません。むしろ、コード内から関数を呼び出す必要があります。ありがとう!

4

2 に答える 2

1

FUNC1$searchFiles2 つ以上のファイル名が含まれている場合、(ブール値の) 配列を返します。

複数の値が含まれている場合でも、これは常に true になり$falseます (配列に含まれる値ではなく、配列をテストしているため)。これを否定すると (the !) 常に与えられる$falseので、の内容は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 になります。これら 2 つの関数を 1 つに組み合わせることができます。

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 に答える