我有以下脚本:
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的建议修改上面的代码。
提前感谢您的帮助。如果您需要更多详细信息,请告诉我们。
答案 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
}