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,因此您if永远不会评估为真。这是因为-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 回答
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 
} 
于 2013-09-18T15:51:12.407 回答