1

アイテムをごみ箱に送る (選択した場合) か、アイテムを完全に削除するスクリプトがあります。スクリプトがローカルで実行される場合、リサイクル ピースは適切に機能します。

ただし、別のコンピューターから実行されている場合 (この場合、ローカル コンピューターはサーバー上の共有フォルダーに対してスクリプトを実行します)、削除は永続的であり、ごみ箱には送信されません。スクリプトは (以前の実行で)最初にアーカイブ ビットをTRUEに設定し、次に (保持するバックアップの数を確認した後) 削除する項目のアーカイブ ビットを設定解除することによって、何削除するかを決定します。その同じスクリプトの実行。

私の考えでは、メイン スクリプトを変更してファイルに削除のマークを付けますが、スクリプトがローカルで実行されている場合にのみファイルを削除するという物理的なアクションを実行するか、リサイクル スクリプトを (単独で) タスクとして配置します。設定された間隔で実行されるごみ箱にアイテムを削除して送信するサーバー上。

私の質問-

  1. Powershell (2.0 を使用) では、ソース コンピューターとターゲット コンピューターをどのように判断しますか? この場合、スクリプトは MyPC から実行されており、そのターゲットは Server1 です。
  2. スクリプトは、ターゲットがマップされたドライブ (ドライブ Y:) であるか、サーバー名 (\Server1) のターゲットであるかに関係なく実行されます。これらの両方のケースで、上記の質問をどのように区別できますか?
4

2 に答える 2

1
  1. $env:COMPUTERNAME でローカル コンピューター名を取得できます。これを使用して、値をターゲット サーバー名と比較します。

  2. ファイルごとに、ドライブがマップされたドライブであるかどうかを最初に確認する必要があります。マップされている場合は、wmi インスタンスからサーバー名を取得し、それを $env:COMPUTERNAME と比較します。

Split-Path次のコマンドレットを使用して、ファイルの 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 に答える