首次使用用户,正在寻找帮助我疯狂的脚本。
基本上,我需要创建一组精确大小(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字节并且脚本停留在循环中。
答案 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 提供带工具提示的自动填充功能:
[streamw
并按 Ctrl - Space 自动填充完整的.NET类名称]::
以查看可用的方法和属性new
并按 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