确定正在执行脚本的位置

时间:2012-04-30 13:05:19

标签: powershell share local delete-file

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

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

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

我的问题 -

  1. 在Powershell中(使用2.0),您如何确定源计算机 与目标计算机?在这种情况下,正在运行脚本 MyPC,它的目标是Server1。
  2. 无论目标是映射驱动器(Drive Y :),脚本都会运行, 或者如果它是servername(\ Server1)的目标。你怎么 在这两种情况下区分上述问题?

2 个答案:

答案 0 :(得分:1)

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

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

  3. 您可以使用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
    

答案 1 :(得分: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]
    }
}
     

上述代码无论哪种方式都有效。再次感谢您的帮助!

相关问题