#部分によって、適切なバッファ長を取得し、ファイルの長さの 関数では、Get-BufferLengthに([ INT ] $ partialFileLength) { [ INT ] $ MinBufferLength = 1メガバイト 大量のメモリを消費する#必要がありません、50Mとして初期化し、あなたはここからそれを調整することができます。 [ INT ] $ MaxBufferLength = 50メガバイト であれば($ partialFileLength - GE 1ギガバイト){戻り$ MaxBufferLength} ELSEIF($ partialFileLength - ル50メガバイト){$ MinBufferLengthを返す} 他 {戻り[ INT ]($ MaxBufferLength / 1ギガバイト* $ partialFileLength)} } 位する部分流を書くファイルの現在位置から 機能誤消去PartialStreamToFile { PARAM( [IO.FileStream] $ストリーム、 [ 長い] $の長さ、 [ ストリング] $ OUTPUTFILE ) する#copyストリームファイル 関数コピーストリーム([ INT ] $をBufferLengthに) { [ バイト []] $バッファ=新オブジェクトバイト[]($ BufferLengthに) #パーシャル読むファイルメモリバッファにデータを $ stream.Read($バッファ、0、$ buffer.Length)| でる-ヌル にする#フラッシュバッファファイル $ OUTSTREAM =新オブジェクトIO.FileStream($ OUTPUTFILE、' 追加'、' 書き込み'、' 読む' ) $ outStream.Write($バッファ、0 、$ buffer.Length) $ outStream.Flushを() $ outStream.Close() } $ maxBuffer = GET- BufferLengthに$長 $ remBuffer = 0 $ループ = [数学] :: DivRem($長、$ maxBuffer、[参考文献] $ remBuffer) 場合($ループ-eq 0 ) { コピー - ストリーム$ remBufferの リターン } 1 .. $ループ| foreachのは、{ $ BufferLengthに = $ maxBuffer #せ最後のループが残留長さが含まれている 場合(($ _ -eqの$ループ) -および($ remBuffer -gt 0 )) { $ BufferLengthに = $ maxBuffer + $ remBuffer } コピー - ストリーム$ BufferLengthには #表示外側の進捗 $進捗 = INT($ _ * 100 / $ループ) 書き込み -progress -活性「足すファイル」 -status 「進歩」 - ID 2 -percentcompleteの$進捗を-currentOperation 「$進行%」 } } #は分割大きなファイルを部品点数や部品の長さによってみとめ部分に 機能スプリットファイル { PARAM ( [パラメータ(必須 = $真)] [IO.FileInfo] $ファイル、 [スイッチ] $ ByPartCount、 [スイッチ] $ ByPartLength、 [ INT ] $ PartCount、 [ INT] $ PartLength、 [IO.DirectoryInfo] $ outputDirの = " 。" ) #引数の検証 であれば(-not $ File.Exists){スロー" ソースは、[$ファイル]をファイルではありませんが存在する" } 場合(-not $ OutputDir.Exists){ は、mkdir $のOutputDir.FullName | OUT- ヌル} もし、((-not $ ByPartCount) -及び( - ない$ ByPartLength)) { スロー' パラメーターのいずれかを指定する必要があり、[ByPartCount]または[ByPartLength] ' } ELSEIF($ ByPartCount) { もし 1($ PartCount -le ){スロー' [PartCount]なければならない1より大きい' } $ PartLength = $ File.Length / $ PartCount } ELSEIF($ ByPartLength) { 場合($ PartLength -lt 1){投' [PartLength]なければなりません0より大きい' } もし($ PartLength -ge $ File.Length){スロー' [PartLength]なければならない以下のソースファイルよりも' } の$ TEMP = $ File.Length / $ PartLength $ PartCount = [ INT ] $の一時 なら(($ File.Length% $ PartLength)-gt 0 - -及び($ PartCount のLT $温度)) { $ PartCount ++ } } $ストリーム =新規作成IO.FileStream($ File.FullNameを、オブジェクト [IO.FileMode ] ::オープン、[IO.FileAccess] ::読む、[IO.FileShare] ::読む) #は、各パーツを確認してくださいファイル名は次のように終わった' 001 '、それように、" 便利なのは、マージする [ 文字列 [] $ numberMaskStr = 文字列 ] :: Empty.PadLeft([ INT ]([数学] ::をLog10($ PartCount)+ 1)、" 0" ) 1.. $ PartCount | foreachの{ $ OUTPUTFILE =参加パス$ outputDirの(" {0} .part_ {1} " - 。$ File.Name F、$ _のToString($ numberMaskStr)) #ショー外側進捗 $進捗 = INT($ _ * 100 / $ PartCount) 書く -progress -活性" 分割ファイルを" -status " 進捗$進捗%" -Id 1 -percentcomplete $進行-currentOperation " ファイル$ OUTPUTFILEハンドル" であれば($ _ -EQ $ PartCount) { 書く -PartialStreamToFile $ストリーム($のStream.length - $ stream.Position)$のOUTPUTFILE } 他 { 書き込み - PartialStreamToFile $ストリーム$ PartLength $ OUTPUTFILE } } $ stream.Close() } 関数 Merge- ファイル { PARAMを( [パラメータ(必須 = $真)] [IO.DirectoryInfo] $ SOURCEDIR、 [ 文字列] $フィルター、 [IO.FileInfo] $ OutputFileは ) #引数の検証 の場合(-not $ SourceDir.Exists){スロー" ディレクトリ$ SOURCEDIRはない存在。" } $ファイルを = DIR $ SOURCEDIR -ファイル- フィルター$フィルター であれば($ファイルは、-eq $ nullの){スロー" ディレクトリ$ SOURCEDIRでマッチしないファイル" } #出力ストリーム $のOutputStream =新規作成オブジェクトIO.FileStream($ OutputFile.FullName、 [IO.FileMode] ::追加、[IO.FileAccess] ::書く、[IO.FileShare] ::読む) #マージファイル $ファイル | foreachの{ #inputストリーム $ InputStreamの =新規作成IO.FileStream(。$ _フルネーム、オブジェクト [IO.FileMode] ::オープン、[IO.FileAccess] ::読む、[IO.FileShare] ::読む) $ BufferLengthに - =は、Get-BufferLengthに。partialFileLength $ _長 しばらく($ inputStream.Position - LT $ inputStream.Length) { 場合(($ inputStream.Position + $ BufferLengthに) - GT $ inputStream.Length) { $ BufferLengthに = $ inputStream.Length - $ inputStream.Position } #ショー外進展 $進捗 = [ INT ]($ inputStream.Position * 100 /$ inputStream.Length)が 書き -progress -活性' マージファイル' -status " プログレス$進捗%を" - はpercentComplete $進捗 #読み取り、ファイルをメモリバッファに $バッファ =新オブジェクトバイト[]($ BufferLengthに) $ inputStream.Read( $バッファ、0、$ buffer.Length)| OUT- ヌル する#flushバッファファイル $ outputStream.Write($バッファ、0、$ buffer.Lengthを)| OUT- ヌル $ outputStream.Flush() } $ inputStream.Close() } $ outputStream.Close()}
使用例 マージ・ファイル・スプリットに#インポート機能 。期間とスクリプトの間のスペースという「E \ -split-File.ps1マージ」#注 「:\ win2012.vhdx E」小さなファイル20に分割して、#ファイルは、ディレクトリへの出力: 'E VHD \' スプリットファイル-ファイル'E:\ win2012.vhdx' -ByPartCount -PartCount 20 -outputdirです: 'Eは、VHD \' 各サイズ:#メンバー'\ win2012.vhdx E' 500メガバイトは、ディレクトリへの出力を分周する'E:\ VHD' 分割ファイルを-file 'E:\ win2012.vhdx' -ByPartLength -PartLength 500メガバイト'E:\ VHD' -outputdir # 'E:\ VHD'ディレクトリ含みます:ファイルのすべての部分は、単一の出力ファイル'\ win2012-2.vhdx E'にマージ -Filter "*一部*" -outputFile 'E:\ win2012-2.vhdx': 'VHD \ E' -SourceDirファイルMerge-