1

我有一个脚本,可以将项目发送到回收站(如果选择)或永久删除项目。如果脚本在本地运行,则回收片可以正常工作。

但是,如果它是从另一台计算机运行的——在这种情况下,我的本地计算机针对服务器上的共享文件夹运行脚本——删除是永久的,并且不会被发送到回收站。脚本(在之前的运行中)通过首先将存档位设置为 TRUE 来决定要删除的内容然后(在查看要保留多少备份之后)取消设置要在下一次删除的项目的存档位执行相同的脚本。

我的想法是更改主脚本以将文件标记为删除,但仅在脚本在本地运行时才执行删除文件的物理操作,或者将回收脚本(单独)作为任务在将删除该项目并将其发送到将以设定的时间间隔运行的回收站的服务器上。

我的问题-

  1. 在 Powershell(使用 2.0)中,您如何确定源计算机与目标计算机?在这种情况下,脚本是从 MyPC 运行的,它的目标是 Server1。
  2. 无论目标是映射驱动器 (Drive Y:) 还是服务器名称 (\Server1) 的目标,脚本都将运行。在这两种情况下,您如何区分上述问题?
4

2 回答 2

1
  1. 您可以使用 $env:COMPUTERNAME 获取本地计算机名称。使用它将值与目标服务器名称进行比较。

  2. 对于每个文件,您必须首先检查驱动器是否是映射驱动器,如果是,则从 wmi 实例获取服务器名称并将其与 $env:COMPUTERNAME 进行比较。

Split-Path您可以使用cmdlet获取文件的 Drive 限定符:

PS> $drive = Split-Path Q:\test.txt -Qualifier
PS> $drive
Q:

然后使用 WMI 获取服务器名称:

PS> (gwmi win32_logicaldisk -filter "drivetype=4 and deviceid='$drive'").ProviderName.Split('\')[2]    
Server1
于 2012-04-30T13:29:49.267 回答
0

OP写道:

@Shay - 感谢您的帮助。我从您在各种 Powershell 网站上发表的许多帖子中学到了很多东西。

我几乎可以使用您建议的所有内容,并且只需要添加一行额外的代码即可使其正常工作。我检查了属性([System.Uri]$markedFile).IsUnc以确定我读取的文件名是否是 UNC 名称。

如果驱动器已映射,则返回 False,如果是 UNC,则返回 True。由此,我可以获取服务器名称并与环境进行比较。代码如下。

$markedFile = "\\Server1\foldername1\Error.log"
#$markedFile = "Y:\foldername1\Error.log"

$TargetComputer = $null
$thisComputer = Get-Content env:computername
if (Test-Path $markedFile) {  # if file exists
    if (([System.Uri]$markedFile).IsUnc) { # if it's a UNC name & not a mapped drive name
        $TargetComputer = ([System.Uri]$markedFile).Host
        }
    else {  #file is not a UNC name, it must be a mapped drive 
        $drive = Split-Path $markedFile -Qualifier
        $TargetComputer = (gwmi win32_logicaldisk -Filter "drivetype=4 and deviceid = '$drive'").Providername.split('\')[2]
    }
}

上面的代码可以使用任何一种方式。再次感谢你的帮助!

于 2015-08-21T20:25:43.743 回答