Powershell脚本:在手工编写时起作用,在生成时不起作用。

时间:2015-03-31 21:40:40

标签: powershell

我有一个磁盘操作,我希望自动使用名为test.ps1的Powershell脚本,如下所示:

diskpart /s diskstuff.txt

文件diskstuff.txt如下所示:

list disk
select disk 0
list partition

当我使用notepad.exe手动创建diskstuff.txt,然后像这样运行它:

PS C:\> powershell.exe .\test.ps1

运行正常,向我提供有关分区的信息。但我只想要一个文件来处理。所以我在test2.ps1中尝试了这个脚本:

$text1 = 'list disk'
$text2 = 'select disk 0'
$text3 = 'list partition'
$text1 > 'diskstuff2.txt'
$text2 >> 'diskstuff2.txt'
$text3 >> 'diskstuff2.txt'
diskpart /s diskstuff2.txt

当我用:

运行脚本时
PS C:\> powershell.exe .\test2.ps1

它没有从 diskpart 返回任何有用的内容。我在 notepad.exe 中检查了diskstuff2.txtdiskstuff.txt,看起来完全相同。

我环顾了一下'网,发现了一种检查文件的更好方法。首先转储手写文件(diskstuff.txt)。

PS C:\> Get-Content diskstuff.txt -Encoding Byte

结果的最后几行是

116
105
111
110
13
10

然后转储生成的文件(diskstuff2.txt

PS C:\> Get-Content diskstuff.txt -Encoding Byte

结果的最后几行是:

116
0
105
0
111
0
110
0
13
0
10
0

这表明生成diskstuff2.txt的脚本以某种方式在每个字符之间插入零。有没有办法让我的脚本生成diskstuff2.txt而没有所有这些零,以便我可以按预期执行test2.ps1

1 个答案:

答案 0 :(得分:1)

重定向运算符>>>对文件使用UTF-16编码。如果您需要不同的编码,则应使用Out-FileSet-Content / Add-Content cmdlet。所有都有-Encoding参数来指定编码。

--------周杰伦更新----------- 这是正确的方法。 test2.ps1的最终答案是:

$text1 = 'list disk'
$text2 = 'select partition 0'
$text3 = 'list partition'
Set-Content -Path diskstuff2.txt -Value $text1 -Encoding UTF8
Add-Content -Path diskstuff2.txt -Value $text2 -Encoding UTF8
Add-Content -Path diskstuff2.txt -Value $text3 -Encoding UTF8
diskpart /s diskstuff2.txt