我正在尝试运行从命令提示符调用PowerShell脚本的.cmd文件,我收到以下错误:
无法加载Management_Install.ps1,因为在此系统上禁用了脚本的执行.
我跑了cmd.exe,当我Management_Install.ps1从PowerShell 运行时,我Get-ExecutionPolicy回来了.
// Powershell的输出
PS C:\ Users\Administrator> get-executionpolicy
无限制
//从DOS输出
C:\ Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scr
ipts> powershell.\ Management_Install.ps1 1
警告:运行x86 PowerShell ...
无法加载文件C:\ Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1,因为在此系统上禁用了脚本的执行.有关详细信息,请参阅"get-help about_signing".
在线:1个字符:25
.\ Management_Install.ps1 <<<< 1
CategoryInfo:NotSpecified:(:) [],PSSecurityException
FullyQualifiedErrorId:RuntimeException
C:\ Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts> pause
按任意键继续 ...
该系统是Windows Server 2008 R2.
我究竟做错了什么?
你如何在PowerShell(1.0或2.0)中注释掉代码?
如何运行PowerShell脚本?
powershell.exe 'C:\my_path\yada_yada\run_import_script.ps1'有或没有--noexit)除了输出文件名外,它什么都不返回.
没有错误,没有消息,没有.哦,当我添加时-noexit,同样的事情发生了,但我仍然在PowerShell中,必须手动退出.
.ps1文件应该运行程序并返回依赖于该程序输出的错误级别.但我很确定我还没有到达那里.
我究竟做错了什么?
我发现设置PATH环境变量只影响旧的命令提示符.PowerShell似乎有不同的环境设置.如何更改PowerShell(v1)的环境变量?
注意:
我希望永久更改我的更改,因此每次运行PowerShell时都不必设置它.PowerShell有配置文件吗?像Unix上的Bash配置文件?
假设我有以下代码段:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Run Code Online (Sandbox Code Playgroud)
我希望这段代码显示:
42 - Slim Shady - Eminem
但相反它显示:
42 + - + Slim Shady + - + Eminem
这让我觉得+运算符不适合连接字符串和变量.
您应该如何使用PowerShell进行此操作?
每当我需要引用一个公共模块或脚本时,我喜欢使用相对于当前脚本文件的路径,这样,我的脚本总能找到库中的其他脚本.
那么,确定当前脚本目录的最佳标准方法是什么?目前,我正在做:
$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
Run Code Online (Sandbox Code Playgroud)
我知道在模块(.psm1)中你可以使用它$PSScriptRoot来获取这些信息,但这不会在常规脚本(即.ps1文件)中设置.
获取当前PowerShell脚本文件位置的规范方法是什么?
处理命令行参数的"最佳"方法是什么?
似乎对"最佳"方式有几个答案,因此我坚持如何处理如下简单的事情:
script.ps1 /n name /d domain
Run Code Online (Sandbox Code Playgroud)
和
script.ps1 /d domain /n name.
Run Code Online (Sandbox Code Playgroud)
有没有一个可以更好地处理这个问题的插件?我知道我在这里重新发明轮子.
显然我已经不是很漂亮而且肯定不是"最好的",但它确实有效..而且它是UGLY.
for ( $i = 0; $i -lt $args.count; $i++ ) {
if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain
Run Code Online (Sandbox Code Playgroud) 有一个PowerShell名为的脚本itunesForward.ps1使iTunes快进30秒:
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
$iTunes.PlayerPosition = $iTunes.PlayerPosition + 30
}
Run Code Online (Sandbox Code Playgroud)
它使用快速行命令执行:
powershell.exe itunesForward.ps1
Run Code Online (Sandbox Code Playgroud)
是否可以从命令行传递参数并将其应用于脚本而不是硬编码的30秒值?
如果我有一个接受多个字符串参数的函数,则第一个参数似乎获取分配给它的所有数据,其余参数作为空传入.
快速测试脚本:
Function Test([string]$arg1, [string]$arg2)
{
Write-Host "`$arg1 value: $arg1"
Write-Host "`$arg2 value: $arg2"
}
Test("ABC", "DEF")
Run Code Online (Sandbox Code Playgroud)
生成的输出是
$arg1 value: ABC DEF
$arg2 value:
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是:
$arg1 value: ABC
$arg2 value: DEF
Run Code Online (Sandbox Code Playgroud)
这似乎在多台机器上的v1和v2之间是一致的,所以很明显,我做错了.任何人都可以指出究竟是什么?
powershell ×10
windows ×2
automation ×1
command-line ×1
commenting ×1
itunes ×1
scripting ×1
syntax ×1