我有一个脚本可以将项目发送到回收站(如果选中)或永久删除项目。如果脚本在本地运行,则回收部分可以正常运行。
但是,如果它是从另一台计算机运行的 - 在这种情况下,我的本地计算机会针对服务器上的共享文件夹运行脚本 - 删除永久,并且不会被发送到回收站。脚本(在之前的运行中)通过首先将存档位设置为 TRUE 然后(在查看要保留的备份数量之后)来决定要删除 WHAT 在下次执行同一脚本时取消设置要删除的项的存档位。
我的想法是改变主脚本以标记要删除的文件,但仅在本地运行脚本时才执行删除文件的物理操作,或者放置回收脚本(单独)作为服务器上的任务将删除&将项目发送到将以设定的间隔运行的回收站。
我的问题 -
答案 0 :(得分:1)
您可以使用$ env:COMPUTERNAME获取本地计算机名称。使用它将值与目标服务器名称进行比较。
对于每个文件,您必须首先检查驱动器是否为映射驱动器,如果是,请从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
答案 1 :(得分:0)
@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] } }
上述代码无论哪种方式都有效。再次感谢您的帮助!