StreamWriter无法在空值表达式上调用方法

时间:2016-10-05 20:37:07

标签: nullpointerexception powershell-v4.0

首次使用用户,正在寻找帮助我疯狂的脚本。

基本上,我需要创建一组精确大小(512KB,2MB,1GB)的文件来测试SAN。这些文件需要填充随机文本,以便SAN不会捕获nuls并实际分配块 - 这也是我无法使用fsutils的原因。 现在,我一直在搞乱Verboon的new-bigrandom文件,并根据我的需要调整它。

但是我收到了错误:

You cannot call a method on a null-valued expression.
At L:\random5.ps1:34 char:9
+         $stream.Write($longstring)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

这是我到目前为止提出的一些代码;我将在末尾添加一个循环来复制我刚刚创建的文件N次以便填充lun。

Set-Strictmode -Version 2.0

#temp file
$file = "c:\temp\temp.rnd"
#charset size
$charset = 64
#Block Size
$blocksize = 512
#page size
$Pagesize = 512KB
#Number of blocks in a page
$blocknum = $Pagesize / $blocksize
#Resulting/desired test file size
$filesize = 1GB
#number of pages in a file
$pagenum = $filesize / $Pagesize

# create the stream writer
$stream = System.IO.StreamWriter $file

# get a 64 element Char[]; I added the - and _ to have 64 chars
[char[]]$chars = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789-_'
1..$Pagenum | ForEach-Object {
# get a page's worth of blocks
1..$blocknum| ForEach-Object {
        # randomize all chars and...
        $rndChars = $chars | Get-Random -Count $chars.Count
        # ...join them in a string
        $string = -join $rndChars
        # repeat random string N times to get a full block string length
        $longstring = $string * ($blocksize / $charset)
        # write 1 block to file
        $stream.Write($longstring)

        # release resources by clearing string variables
        Clear-Variable string, longstring
    }
}
$stream.Close()
$stream.Dispose()
# release resources through garbage collection
[GC]::Collect()
$file.Close()

我尝试了很多变种,如:

$stream = [System.IO.StreamWriter] $file
$stream = System.IO.StreamWriter $file
$stream = NewObject System.IO.StreamWriter $file

当然,作为powershell的总菜鸟,我尝试过使用引号,括号,提供完整路径而不是变量等等。所有(或大多数)似乎都是有效的语法变体,根据a我在网上找到的大量例子,但输出结果仍然相同。

如果您有任何改进建议或替代方式来执行此任务,我全心全意。

编辑上面的脚本:只是几个" for $ file使错误消失, - 谢谢LinuxDisciple;但是,文件被创建但保持在0字节并且脚本停留在循环中。

2 个答案:

答案 0 :(得分:0)

将StreamWriter的实例化修复为以下任何正确的变体:

$stream = [System.IO.StreamWriter]::new($file)

$stream = [IO.StreamWriter]::new($file) # the default namespace may be omitted

$stream = New-Object System.IO.StreamWriter $file

您可以指定编码:

$stream = [IO.StreamWriter]::new(
    $file,
    $false, # don't append
    [Text.Encoding]::ASCII
)

有关可用的构造函数和参数,请参阅StreamWriter on MSDN

PowerShell ISE 提供带工具提示的自动填充功能:

  1. 键入[streamw并按 Ctrl - Space 自动填充完整的.NET类名称
  2. 键入]::以查看可用的方法和属性
  3. 键入new并按 Ctrl - Space 以查看构造函数覆盖
  4. 在需要时,将插入符号放在方法名称上,然后按 Ctrl - Space 获取工具提示

答案 1 :(得分:-1)

我对powershell一无所知,但有一些事情:

在调用stream.Write()之前,你确定$ longstring有一个值吗?它听起来像是空的,这就是错误的原因。如果你能以某种方式将$ longstring的值输出到控制台,它将帮助你确保它有一个值。

此外,使用简化版本的代码对代码进行故障排除,以便您可以查明正在进行的操作,例如

danbj$ git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 503 bytes | 0 bytes/s, done.
Total 5 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
**load: 1.94  cmd: ssh 30002 waiting 0.01u 0.01s**
load: 2.11  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.11  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.10  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.10  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.09  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.09  cmd: ssh 30002 waiting 0.01u 0.01s
load: 2.08  cmd: ssh 30002 waiting 0.01u 0.01s