使用powershell根据预定义大小创建空白文本文件

ulydmbyx  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(119)

使用下面的代码,我试图创建一个空白的文本文件

$fileSizeInKB = $File_size_for_warning / 1KB
$filePath = "C:\Testfile.txt"
New-Item -Path $filePath -ItemType File -Value ([char]0) * $fileSizeInKB

字符串

$File_size_for_warning的字节值为45883181261

我得到下面的错误,而执行代码

New-Item : A positional parameter cannot be found that accepts argument '*'.
At E:\Monitoring_Test.ps1:126 char:1
+ New-Item -Path $filePath -ItemType File -Value ([char]0) * $fileSizeI ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Item], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand


请让我知道这里出了什么问题,还有其他方法吗

gjmwrych

gjmwrych1#

由于文件大小为large(~43 GiB),您应该使用不同的方法。您当前的方法将在将其写入文件之前完全在内存中创建此大小的字符串。这甚至是不可能的,因为maxium size of a string要小得多。即使可能,您也不想浪费这么多内存。
使用.NET file system API可以更有效地创建任何大小的空白文件,而不会产生内存开销:

$File_size_for_warning = 45883181261
$filePath = "C:\Testfile.txt"

# Create a file of 0 bytes using PowerShell to convert its path to a full path for
# use with .NET API. If you can ensure that $filePath is always a full path,
# then you don't need this step.
$filePath = (New-Item $filePath -Force).Fullname

# Open the file using .NET API.
$file = [IO.File]::Create( $filePath )
try {
    # Adjust the file size using .NET API. It will be automatically 
    # filled with null bytes.
    $file.SetLength( $File_size_for_warning )
}
finally {
    # Make sure the file is closed even in case of an exception.
    $file.Close()
}

字符串
关于您当前的方法,它通常适用于小型到中型文件(最多约1 GiB),但有几个错误需要修复:

  • 而不是以KB为单位指定大小,您应该使用byte size$File_size_for_warning。当LHS参数是字符串或数组时,乘法运算符需要int
  • 在这种情况下,乘法运算符需要一个数组或一个字符串,因此您需要将char转换为string或直接在字符串中指定空字节,如下面的示例所示。
  • 最后,您需要在用作参数的表达式**周围添加括号。PowerShell命令的参数在 * 参数模式 * 下解析,要使用表达式,您需要通过使用括号强制PowerShell进入 * 表达式模式 *。在参数模式下,解析器只能理解一些简单的表达式,如访问变量。
New-Item -Path $filePath -ItemType File -Value ("`0" * $File_size_for_warning)

相关问题