复制项目后,Powershell Remove-Item IF文件已存在

时间:2014-04-21 23:13:43

标签: powershell

我需要在我的脚本中添加一个安全网。我正在尝试根据通过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
}

3 个答案:

答案 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
  }
}
    如果给定路径中的文件存在,
  • 测试路径会返回 $ true ,否则 $ false
  • $_ -replace "^$([regex]::escape($source))","$dest"通过使用 $ dest替换路径开头的 $ source ,转换您使用相应目标路径枚举的每个源项的路径即可。
  • -replace 运算符的第一个参数的基本正则表达式是^$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命令行开关将帮助您检查文件是否存在

http://technet.microsoft.com/en-us/library/ee177015.aspx