我需要在我的脚本中添加一个安全网。我正在尝试根据通过txt文件提供的用户列表来执行复制作业。将文件从该用户主目录复制到新位置。复制文件后,检查文件是否存在于新位置。如果是,则删除项目。
有人能帮助我吗?我只是不知道如何实现“if file exists”逻辑。
$username = Get-Content '.\users.txt'
foreach ($un in $username)
{
$dest = "\\server\homedirs\$un\redirectedfolders"
$source = "\\server\homedirs\$un"
New-Item -ItemType Directory -Path $dest\documents, $dest\desktop
Get-ChildItem $source\documents -Recurse -Exclude '*.msg' | Copy-Item -Destination $dest\documents
Get-ChildItem $source\desktop -Recurse -Exclude '*.msg' | Copy-Item -Destination $dest\desktop
Get-ChildItem $source\mydocuments, $source\desktop -Recurse -Exclude '*.msg' | Remove-Item -Recurse
}
答案 0 :(得分:15)
如果文件不存在,删除文件的最短方法不是使用Test-Path
,而是:
rm my_file.zip -ea ig
这是
的简短版本 rm my_file.zip -ErrorAction Ignore
更可读,更干燥
if (Test-Path my_file.zip) { rm my_file.zip }
答案 1 :(得分:6)
要回答您的问题本身,您可以这样做:
Get-ChildItem $source\mydocuments, $source\desktop -Recurse -Exclude '*.msg' | %{
if (Test-Path ($_. -replace "^$([regex]::escape($source))","$dest")) {
Remove-Item $_ -Recurse
}
}
$_ -replace "^$([regex]::escape($source))","$dest"
通过使用 $ dest替换路径开头的 $ source ,转换您使用相应目标路径枚举的每个源项的路径即可。^$source
(这意味着"匹配 $ source 的值字符串的开头")。但是,如果 $ source 包含任何正则表达式特殊字符,您需要使用 [regex] :: escape ,实际上极可能与Windows路径,因为它们包含反斜杠。例如,您在此处为 $ source 提供的值包含\s
,其在正则表达式中表示"任何空白字符"。 $([regex]::escape($source))
将使用正确转义的任何正则表达式特殊字符插入 $ source 的值,以便您与显式值匹配。也就是说,如果你的目的是将每个项目复制到一个新的位置,并且只有当复制到新位置时才删除原件,看起来你正在重新发明轮子。为什么不使用 Move-Item 而不是 Copy-Item ?
与问题没有直接关系,但您可以使用 foreach 循环,而不是为每个子目录重复相同的命令:
foreach ($subdir in (echo documents desktop)) {
# Whatever command you end up using to copy or move the items,
# using "$source\$subdir" and "$dest\$subdir" as the paths
}
答案 2 :(得分:2)
Test-Path命令行开关将帮助您检查文件是否存在