通常,PowerShell命令可以用分号链接。 以下打开2个记事本:
PS> notepad; notepad
你也可以链接一个更复杂的语句:
PS> Add-Type -AssemblyName System.IO.Compression; ` > $src = "C:\aFolder"; $zip="C:\my.zip"; ` > [io.compression.zipfile]::CreateFromDirectory($src, $zip)
链式PowerShell命令也可以从CMD命令行调用:
C:\> powershell notepad; notepad
本文描述了一个创build.Net 4.0 PowerShell提示符的方法,即使.Net 2.0是您的操作系统上的活动框架。 您创build一个.cmd脚本,并运行该脚本。 现在你在.Net 4.0环境中。
链接也适用于4.0提示:
C:\> ps4.cmd PS> notepad; notepad
也可以从标准CMD提示符下运行:
C:\> ps4 notepad; notepad
本文描述了一种将Add-Type
到显式path名的方法(需要从ps4提示符引用4.0程序集):
Add-Type -Path "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.IO.Compression.FileSystem\v4.0_4.0.0.0__b77a5c561934e089\System.IO.Compression.FileSystem.dll"
即使在ps4提示符处链接时,也是如此:
C:\> ps4 PS> Add-Type -Path "C:\x\System.IO.Compression.FileSystem.dll"; ` > $src = "C:\x\xl"; $zip="C:\x\xl.zip"; ` > [io.compression.zipfile]::CreateFromDirectory($src, $zip)
问题:在标准命令提示符下启动ps4时,链接上述语句失败(错误已完全显示在文章底部):
C:\> ps4 Add-Type -Path "C:\x\System.IO.Compression.FileSystem.dll"; $src = "C:\x\xl"; $zip="C:\x\xl.zip"; [io.compression.zipfile]::CreateFromDirectory($src, $zip)
但是,以上所有方法都有效。 为什么? 我怎样才能做这个工作?
术语“C:\ x \ xl”不被识别为cmdlet,函数,脚本的名称 文件或可操作的程序。 检查名称的拼写,或者path是 包括,validationpath是正确的,然后再试一次。 在线:1个字符:73 + Add-Type -Path C:\ x \ System.IO.Compression.FileSystem.dll; $ src = C:\ x \ xl <<<<; $拉链= C:\ X \ xl.zip; [io.compression.zipfile] :: CreateFromDirectory($ src,$ zip) + CategoryInfo:ObjectNotFound:(C:\ x \ xl:String)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException 术语'C:\ x \ xl.zip'不被识别为cmdlet的名称,函数, 脚本文件或可操作的程序。 检查名称的拼写,或者path 包括在内,请validationpath是否正确,然后重试。 在线:1个字符:91 + Add-Type -Path C:\ x \ System.IO.Compression.FileSystem.dll; $ src = C:\ x \ xl; $ zip = C:\ x \ xl.zip <<<<; [io.compression.zipfile] :: CreateFromDirectory($ src,$ zip) + CategoryInfo:ObjectNotFound:(C:\ x \ xl.zip:String)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException 使用“2”参数调用“CreateFromDirectory”exception:“path不是 的法律forms“。 在线:1 char:138 + Add-Type -Path C:\ x \ System.IO.Compression.FileSystem.dll; $ src = C:\ x \ xl; $拉链= C:\ X \ xl.zip; [io.compression.zipfile] :: CreateFromDirectory <<<<($ src,$ zip) + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException
将菊花链命令传递到powershell.exe
时,将删除字符串周围的双引号。 Add-Type
不受此影响,因为路径不包含空格,所以它不需要引号:
Add-Type -Path C:\x\System.IO.Compression.FileSystem.dll # <- this works
但是,在一个赋值操作中,PowerShell需要将字符串用引号括起来,否则会将该字符串解释为命令并尝试执行它:
$src = C:\x\xl # <- this would try to run a (non-existent) command 'C:\x\xl' # and assign its output to the variable instead of assigning # the string "C:\x\xl" to the variable
这是导致您观察到的前两个错误的原因。 第三个错误是后续错误,因为两个路径变量未正确初始化。
你应该能够通过转义双引号来避免这种行为:
ps4 Add-Type -Path \"C:\x\System.IO.Compression.FileSystem.dll\"; $src = \"C:\x\xl\"; $zip=\"C:\x\xl.zip\"; [io.compression.zipfile]::CreateFromDirectory($src, $zip)
或者用单引号替换它们(因为后者不被CMD识别为引用字符,因此按原样传递给PowerShell,它将它们识别为引号字符):
ps4 Add-Type -Path 'C:\x\System.IO.Compression.FileSystem.dll'; $src = 'C:\x\xl'; $zip='C:\x\xl.zip'; [io.compression.zipfile]::CreateFromDirectory($src, $zip)
但是,我建议不要解决这个问题,而是建议并运行适当的PowerShell脚本,以便完全避免这个问题:
#requires -version 4 [CmdletBinding()] Param( [Parameter(Mandatory=$true)] [string]$Path, [Parameter(Mandatory=$true)] [string]$Zipfile, ) Add-Type -Assembly 'System.IO.Compression.FileSystem' | Out-Null [IO.Compression.ZipFile]::CreateFromDirectory($Path, $Zipfile)
脚本将像这样运行:
powershell.exe -File zip.ps1 -Path "C:\x\xl" -Zipfile "C:\x\xl.zip"
如果将执行策略更改为RemoteSigned
或Unrestricted
,并且更改.ps1文件的默认处理程序,则甚至可以像这样运行脚本:
zip.ps1 -Path "C:\x\xl" -Zipfile "C:\x\xl.zip"