【问题标题】:Powershell - Copy Script LoopPowershell - 复制脚本循环
【发布时间】:2013-09-18 15:11:15
【问题描述】:

我有以下脚本:

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

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

【问题讨论】:

    标签: powershell foreach


    【解决方案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\$_ 
            } #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 "-")
    

    【讨论】:

    • 感谢您的意见。我根据您的建议修改了我的脚本,并在某处的底部找到了一个额外的括号。但不幸的是,它仍然会产生相同的行为。很奇怪。
    • @Fro 你保存你的脚本了吗? :D 只是检查。请仔细检查你的括号......正如你所拥有的那样,你的else在你的if里面......这甚至没有意义!
    • 是的,我保存了它:D 还修改了原始问题中的脚本,以便您可以看到它现在的位置。
    • 所以...我输入 3-6 作为范围,它在 FOLDER 文件夹中创建了一个名为 3-6 的文件(如果有意义的话),而不是将所有文件复制到名为3..6.
    • @Fro 是的,这是有道理的。您的if 永远不会计算为true,因此它总是属于else。尝试将您的 if 更改为我在编辑中包含的代码。
    【解决方案2】:

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

    $copyTo -like '*-*'
    
    $copyTo -match '-'
    

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

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

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

    $copyTo.Contains('-')
    

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,$_ 应该是目标文件夹名称。但是您的脚本不知道这一点,因此它将 $_ 视为文件名。您需要创建目标文件夹(如果它们不存在)并更改您的 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 
      } 
      

      【讨论】:

      • 你是正确的 $_ 是文件夹名称。但是文件夹已经存在,所以我不需要使用 New-Item。
      猜你喜欢
      • 2021-11-22
      • 2017-04-17
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 2022-10-17
      • 2018-02-12
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多