web-dev-qa-db-ja.com

ハードドライブ上のファイルを検索し、存在する場合は削除します

従来のプログラムは、C:\Temp\*\FileToRemove.txtまたはC:\Windows\Temp\*\FileToRemove.txt内の2つの場所のいずれかにファイルを作成しました。ファイルにはネットワークにアクセスできないデータが含まれているため、このファイルをネットワーク上のコンピューターから削除する必要があります。 。

私はこの変更されたスクリプトを1つの場所で実行しようとしていますが、ファイルは検出されますが、期待どおりにファイルが削除されません。

function delete-remotefile {
  PROCESS {
    $file = Get-ChildItem -Path C:\Temp\* -Include FileToRemove.txt -Recurse
    if (Test-Path $file -PathType Leaf)
    {
      echo "file exist"
      Remove-Item $file -Force
      echo "file deleted"
    }
  }
}

Get-Content C:\Computers.txt | delete-remotefile
  • 私の目標は両方の場所を検索することですが、これはローカルコンピューターでのみ機能し、単一の場所を探します。ファイルがそこにない場合、スクリプトはエラーになります。

ファイルがない場合、このスクリプトをエラーなしで完了するにはどうすればよいですか?

3

あなたのシステムがそのように到達可能であるとあなたが言ったので、私はUNCパスを使いました。検索するパスがリストされていることに注意してくださいc$\tempコマンドラインでアドレス指定するのと同じように。

何も削除しませんでした。必要に応じて追加できると思います。

コードはかなりよくコメントされているようですが、質問がある場合は...質問してください。 [ニヤリ]

# save the Verbose setting
$Old_VPref = $VerbosePreference
# enable display of Write-Verbose
$VerbosePreference = 'Continue'

#region >>> fake reading in a list of computers
#    in real life, use Get-Content
$ComputerList = @'
LocalHost
10.0.0.1
127.0.0.1
BetterNotBeThere
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a list of computers

$RootDirList = @(
    'c$\temp'
    'C$\Windows\Temp'
    )
$FileToFindList = @(
    # when ready to do this for real,
    #    put your real file name on the next line
    #'FileToRemove.txt'
    #    then remove or comment out the two fake ones below
    'ThisIsTheOne.txt'
    'Not_There.txt'
    )
$NotFound = '__FileNotFound__'
$NoResponse = '__No_Response__'

$Results = foreach ($CL_Item in $ComputerList)
    {
    Write-Verbose ('Checking {0} ...' -f $CL_Item)
    if (Test-Connection -ComputerName $CL_Item -Count 1 -Quiet)
        {
        foreach ($RDL_Item in $RootDirList)
            {
            foreach ($FTFL_Item in $FileToFindList)
                {
                $GCI_Params = @{
                    Path = '\\{0}\{1}' -f $CL_Item, $RDL_Item
                    Filter = $FTFL_Item
                    Recurse =$True
                    File = $True
                    ErrorAction = 'SilentlyContinue'
                    }
                $FileInfo = Get-ChildItem @GCI_Params

                $IsThere = [bool]$FileInfo
                if ($IsThere)
                    {
                    $FoundPath = $FileInfo.FullName
                    }
                    else
                    {
                    $FoundPath = $NotFound
                    }
                [PSCustomObject]@{
                    ComputerName = $CL_Item
                    FileName = $FTFL_Item
                    RootDir = $RDL_Item
                    IsThere = $IsThere
                    FoundPath = $FoundPath
                    }
                } # end >>> foreach ($FTFL_Item in $FileToFindList)
            } # end >>> foreach ($RDL_Item in $RootDirList)
        }
        else
        {
        Write-Warning ('    {0} did not respond.' -f $CL_Item)
        [PSCustomObject]@{
            ComputerName = $CL_Item
            FileName = $NoResponse
            RootDir = $NoResponse
            IsThere = $NoResponse
            FoundPath = $NoResponse
            }
        } # end >>> if (Test-Connection -ComputerName $CL_Item -Count 1 -Quiet)
    } # end >>> foreach ($CL_Item in $ComputerList)

# restore old verbose pref
$VerbosePreference = $Old_VPref

# show on screen
#    pipe this to Export-Csv if you want to save the info
$Results

スクリプト実行中の出力.。

VERBOSE: Checking LocalHost ...
VERBOSE: Checking 10.0.0.1 ...
WARNING:     10.0.0.1 did not respond.
VERBOSE: Checking 127.0.0.1 ...
VERBOSE: Checking BetterNotBeThere ...
WARNING:     BetterNotBeThere did not respond.

スクリプトの最後にある$ Resultsの切り捨てられた出力.。

ComputerName : LocalHost
FileName     : ThisIsTheOne.txt
RootDir      : c$\temp
IsThere      : True
FoundPath    : \\LocalHost\c$\temp\KSN_TestRootDir\ThisIsTheOne.txt

ComputerName : LocalHost
FileName     : Not_There.txt
RootDir      : c$\temp
IsThere      : False
FoundPath    : __FileNotFound__

ComputerName : LocalHost
FileName     : ThisIsTheOne.txt
RootDir      : C$\Windows\Temp
IsThere      : True
FoundPath    : \\LocalHost\C$\Windows\Temp\KSN_TestDir_Level_1\KSN_TestDir_Level_2\ThisIsTheOne.txt

ComputerName : LocalHost
FileName     : Not_There.txt
RootDir      : C$\Windows\Temp
IsThere      : False
FoundPath    : __FileNotFound__

ComputerName : 10.0.0.1
FileName     : __No_Response__
RootDir      : __No_Response__
IsThere      : __No_Response__
FoundPath    : __No_Response__

[*...snip...*] 

ComputerName : BetterNotBeThere
FileName     : __No_Response__
RootDir      : __No_Response__
IsThere      : __No_Response__
FoundPath    : __No_Response__
0
Lee_Dailey