1

以下のスクリプトがあります。

function copyUserSettings {
    Write-Host
    $copyFrom = Read-Host 'Which Folders Do You Want To Copy FROM?'
    Write-Host
    $copyTo = Read-Host 'Which Folders Do You Want To Copy TO? (Enter a Number OR Range eg. 12-18)'
    Write-Host

    IF ($copyTo.Contains("-")) {
        $copyToStart = $copyTo.Split("-")[0]
        $copyToEnd = $copyTo.Split("-")[1]

        $copyToStart..$copyToEnd | foreach{
            Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$_
        }
    } else {
        Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$copyTo
    }
}

ユーザーは、単一のフォルダー名または範囲 (つまり、12- 18)。単一の数値を入力すると、上記のスクリプトは適切に機能しますが、範囲を入力すると、ファイルがコピーされず、フィードバック エラーなども発生しません。

Edit1:$rootPathは、スクリプトの前半で定義されています。Edit2: @tnw の提案に従って上記のコードを修正しました。

よろしくお願いします。詳細が必要な場合は、お知らせください。

4

3 に答える 3

3

閉じ括弧の位置を間違えたようです。そのブラケットをあるべき場所に移動しました(と思います)。これらの問題を回避するには、より適切なタブ操作を行う必要があります。

function copyUserSettings {
    Write-Host
    $copyFrom = Read-Host 'Which Folders Do You Want To Copy FROM?'
    Write-Host
    $copyTo = Read-Host 'Which Folders Do You Want To Copy TO? (Enter a Number OR Range eg. 12-18)'
    Write-Host

    IF ($copyTo -Contains "-") {
        $copyToStart = $copyTo.Split("-")[0]
        $copyToEnd = $copyTo.Split("-")[1]

        $copyToStart..$copyToEnd | foreach {
            Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$_ 
        } #this bracket was missing
    } else {
        Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$copyTo
    }
} #you had an extra closing bracket here

編集:それを理解しました。これを見てください:

"12-18" -Contains "-"

に評価されるfalseため、iftrue に評価されることはありません。これは、部分文字列ではなくコレクション-Contains用であるためです。ドキュメントから:「参照値のコレクションに単一のテスト値が含まれているかどうかを示します」

代わりにこれを試してください:

IF ($copyTo.Contains("-"))

-Match次の演算子を使用することもできます。

IF ($copyTo -Match "-")
于 2013-09-18T15:29:10.713 に答える
1

この-contains演算子は、セット (リスト/配列など) に特定のアイテムが含まれているかどうかをチェックします。文字列に特定の文字が含まれているかどうかを確認するには、-likeor-match演算子を使用する必要があります。

$copyTo -like '*-*'

$copyTo -match '-'

この-match演算子を使用すると、文字列の適切な場所に数字が含まれているかどうかを確認し、文字列からそれらの数字を抽出することもできます。

if ($copyTo -match '^(\d+)-(\d+)$') {
  $start = $matches[1]
  $end   = $matches[2]
}

別のオプションは、 tnwが提案しContains()た文字列クラスのメソッドを使用することです。

$copyTo.Contains('-')
于 2013-09-18T16:38:13.273 に答える