2012-04-30 14 views
1

ごみ箱にアイテムを送るか(選択した場合)、アイテムを永久に削除するスクリプトがあります。スクリプトがローカルで実行されている場合、リサイクル作品は正常に動作します。スクリプトが実行されている場所を確認

ただし、別のコンピュータから実行した場合 - この場合、ローカルマシンはサーバー上の共有フォルダに対してスクリプトを実行します。削除はの永久的なです。ごみ箱に送られません。このスクリプトは、WHATの場合、最初にアーカイブビットをTRUEに設定してから削除します(保持するバックアップの数を確認した後に、アイテムのアーカイブビットの設定を解除します)。同じスクリプトの次の実行時に削除されます。

主なスクリプトを変更してファイルにマークを付けて削除するようにしましたが、スクリプトがローカルで実行されているときにのみファイルを削除するという物理的な操作や、 )をサーバー上のタスクとして削除すると、&は、指定した間隔で実行されるアイテムをごみ箱に送信します。 (2.0を使用して)PowerShellで

マイquestions-

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

答えて

1
  1. あなたは、$ ENVとローカルのコンピュータ名を取得することができます。この値を使用して、ターゲットサーバー名と値を比較します。

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

あなたはSplit-Pathコマンドレットを使用して、ファイルのドライブ修飾子を得ることができます。

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 
+0

ありがとうございました。 (私の場合は)サーバー名にもファイルまたはフォルダパスが含まれている可能性がありますので、\\ Server1 \ filepath1 \ filepath2 \ test.txtのサーバー部分をどのように判断しますか?上記がうまくいきます。 –

+0

文字列解析または正規表現を使用できます。 ([System.Uri] "\\ Server1 \ filepath1 \ filepath2 \ test.txt")。ホスト –

+0

私はきちんとしたコードをアップアップしましたが、私はプログラム的にどのように判断するのでしょうかドライブがマップされたドライブの場合経験的には、 '(gwmi win32_logicaldisk -filter drivetype = 4とdeviceid = 'C:'")-eq $ null'のように見えますが、もっと簡単なことがありますか? –

0

ザ・OPは書いた:

@Shay - ご協力いただきありがとうございます。私はPowershellのさまざまなサイトで多くの投稿から多くのことを学んだ。

あなたが提案したほとんどすべてを使用できました。コードを追加して動作させるだけでした。私が読み取ったファイル名がUNC名かどうかを調べるために、プロパティー([System.Uri]$markedFile).IsUncを調べました。

ドライブがマップされている場合は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] 
    } 
} 

上記のコードはどちらでも動作します。あなたの助けをもう一度ありがとう!

+0

(質問に回答し、コミュニティのwikiに変換しました)(http://meta.stackoverflow.com/questions/267434/what-is-the-appropriate-action-when-the-answer-to-a-疑問が追加されました)。 –

関連する問題