7

Windows 10 で PowerShell コマンドを実行すると、奇妙な動作が発生します。

ファイルの作成日を変更するには、次を使用します。

Get-ChildItem  C:\testFile1.txt | % {$_.CreationTime = '01/11/2005 06:00:36'}

フォルダーの作成日を変更するには、次を使用します。

Get-Item  C:\testFolder1 | % {$_.CreationTime = '01/11/2004 22:13:36'}

これらの 2 つのコマンドは、システム パーティション C:\ またはデスクトップで定期的に正常に機能します。

フォルダが外部 USB フラッシュ ドライブに存在する場合は話が異なります。

(追記: ファイルのタイムスタンプを変更するコマンドは、外部 USB フラッシュ ドライブで引き続き機能します。)

外部 USB フラッシュ ドライブ上のフォルダー (ファイルではない) の作成日を変更しようとするとします。

Get-Item  U:\testFolder1 | % {$_.CreationTime = '01/11/2002 06:00:36'}

次のエラー メッセージが表示されます。

例外設定 "CreationTime": "別のプロセスで使用されているため、プロセスはファイル 'U:\testFolder1' にアクセスできません。"
行:1 文字:31
+ ... et-Item U:\testFolder1 | % {$_.CreationTime = '01/11/2002 06:00:36'}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) []、SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting

さらに掘り下げてみると、そのプロセスは Windows 10 のファイル エクスプローラーであり、タイムスタンプを変更できないことがわかりました。ファイル エクスプローラーを開かない限り、PowerShell を使用して、USB フラッシュ ドライブ上のフォルダーの作成日を変更できます。

.Dispose() のようなもので、Windows 10 のファイル エクスプローラーが毎回ファイル エクスプローラーを閉じる必要なくフォルダーをロックしないようにする方法はありますか?

4

2 に答える 2

3

SysInternals の Handle.exe を使用してファイルをロックしているプロセスを見つけ、そのプロセスのファイルのロックを解除しようとする機能を手元に置いておきます。

Function Close-LockedFile{
Param(
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)][Object[]]$InputFile
)
Begin{
    $HandleApp = 'C:\localbin\Handle.exe'
    If(!(Test-Path $HandleApp)){Write-Host "Handle.exe not found at $HandleApp`nPlease download it from www.sysinternals.com and save it in the afore mentioned location.";break}
}
Process{
    $HandleOut = Invoke-Expression ($HandleApp+' '+$InputFile.Fullname)
    $Locks = $HandleOut |?{$_ -match "(.+?)\s+pid: (\d+?)\s+type: File\s+(\w+?): (.+)\s*$"}|%{
        [PSCustomObject]@{
            'AppName' = $Matches[1]
            'PID' = $Matches[2]
            'FileHandle' = $Matches[3]
            'FilePath' = $Matches[4]
        }
    }
    ForEach($Lock in $Locks){
        Invoke-Expression ($HandleApp + " -p " + $Lock.PID + " -c " + $Lock.FileHandle + " -y") | Out-Null
    }
    $InputFile
}
}

ファイルをそれにパイプできるはずです。ロックされているファイルのロックを解除し、ファイル オブジェクトをパイプに渡します。

于 2016-08-15T17:51:08.783 に答える