Powershell - 复制脚本循环

时间:2013-09-18 15:11:16

标签: powershell foreach

我有以下脚本:

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的建议修改上面的代码。

提前感谢您的帮助。如果您需要更多详细信息,请告诉我们。

3 个答案:

答案 0 :(得分: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,因此您的if永远不会评估为true。这是因为-Contains用于集合,而不是子字符串。从文档中:“告诉集合参考值是否包含单个测试值”

请改为尝试:

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

您还可以使用-Match运算符:

IF ($copyTo -Match "-")

答案 1 :(得分:1)

-contains运算符检查集合(例如列表/数组)是否包含特定项目。要检查字符串是否包含特定字符,您需要使用-like-match运算符:

$copyTo -like '*-*'

$copyTo -match '-'

-match运算符还允许您验证字符串是否包含正确位置的数字,并从字符串中提取这些数字:

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

另一种选择是使用字符串类的Contains()方法作为tnw建议:

$copyTo.Contains('-')

答案 2 :(得分:0)

如果我理解你的问题,$ _应该是目标文件夹名称。但是你的脚本并不知道所以它将$ _视为文件名。您需要创建目标文件夹(如果它们不存在)并更改您的Copy-Item目标。例如:

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