PowerShell 可以将普通文件夹转换为 ISO 文件。ISO 文件是二进制文件,可以被挂载并表现得像只读 CD-ROM 驱动器。
过去,ISO 文件常用于挂载安装媒体。如今,您可以轻松地创建自己的 ISO 文件,这些文件是从您自己的文件夹和文件中创建的。这样,您可以创建一个简单的备份系统,或者轻松地在同事之间共享项目。由于 ISO 文件只是一个单一的文件,因此可以轻松地共享,而且由于 Windows 通过双击挂载它们,并在 Windows 资源管理器中显示它们作为 CD-ROM 驱动器,您可以立即使用数据而无需提取或解压任何内容。
与 VHD 映像文件不同,挂载 ISO 文件不需要管理员特权。任何人都可以挂载和使用 ISO 文件。
由于没有内置的 cmdlet 将文件夹结构转换为 ISO 文件,您需要自己调用内部 API。下面的代码定义了新函数 New-IsoFile:
functionNew-IsoFile { param ( # path to local folder to store in # new ISO file (must exist) [Parameter(Mandatory)] [String] $SourceFilePath,
# name of new ISO image (arbitrary, # turns later into drive label) [String] $ImageName = 'MyCDROM',
# path to ISO file to be created [Parameter(Mandatory)] [String] $NewIsoFilePath,
# if specified, the source base folder is # included into the image file [switch] $IncludeRoot )
# use this COM object to create the ISO file: $fsi = New-Object-ComObject IMAPI2FS.MsftFileSystemImage
# use this helper object to write a COM stream to a file: # compile the helper code using these parameters: $cp = [CodeDom.Compiler.CompilerParameters]::new() $cp.CompilerOptions = '/unsafe' $cp.WarningLevel = 4 $cp.TreatWarningsAsErrors = $true $code = ' using System; using System.IO; using System.Runtime.InteropServices.ComTypes; namespace CustomConverter { public static class Helper { // writes a stream that came from COM to a filesystem file public static void WriteStreamToFile(object stream, string filePath) { // open output stream to new file IStream inputStream = stream as IStream; FileStream outputFileStream = File.OpenWrite(filePath); int bytesRead = 0; byte[] data; // read stream in chunks of 2048 bytes and write to filesystem stream: do { data = Read(inputStream, 2048, out bytesRead); outputFileStream.Write(data, 0, bytesRead); } while (bytesRead == 2048); outputFileStream.Flush(); outputFileStream.Close(); } // read bytes from stream: unsafe static private byte[] Read(IStream stream, int byteCount, out int readCount) { // create a new buffer to hold the read bytes: byte[] buffer = new byte[byteCount]; // provide a pointer to the location where the actually read bytes are reported: int bytesRead = 0; int* ptr = &bytesRead; // do the read: stream.Read(buffer, byteCount, (IntPtr)ptr); // return the read bytes by reference to the caller: readCount = bytesRead; // return the read bytes to the caller: return buffer; } } }'