加载模块时 PowerShell 是否调用任何初始化代码?
我正在寻找类似 Perl BEGIN 块或构造函数的东西。
NEW-MODULE 和 IMPORT-MODULE 都将返回一个 PSCustomObject。我正在尝试将自定义对象封装在模块中以避免脚本中的冗长代码。在开放代码中测试良好的一种方法是:
$m = new-module -scriptblock {
New-Object PSCustomObject |
Add-Member NoteProperty -name person -value Frodo -passthru |
Add-Member ScriptMethod Who { $this.person } -passthru |
Add-Member ScriptMethod Mod {
param($x)
$this.person = $x
} -passthru
} -ascustomobject -returnresult
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将此代码放入模块并使用以下内容:
$MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject
Run Code Online (Sandbox Code Playgroud)
并让 MyObj 成为与第一个片段提供的对象相同的对象句柄。
建议表示赞赏。
说我有MyScript.ps1:
[cmdletbinding()]
param (
[Parameter(Mandatory=$true)]
[string] $MyInput
)
function Show-Input {
param ([string] $Incoming)
Write-Output $Incoming
}
function Save-TheWorld {
#ToDo
}
Write-Host (Show-Input $MyInput)
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式点源函数?问题是,如果上面的脚本是点源,它执行整个事情......
我是使用Get-Content和解析函数并使用Invoke-Expression ...的最佳选择吗?或者有没有办法以编程方式访问PowerShell的解析器?我发现这可能是PSv3使用的可能,但这[System.Management.Automation.Language.Parser]::ParseInput不是一个选项,因为它必须在PSv2上工作.
我之所以要问的是,我正在尝试Pester PowerShell单元测试框架,以及它在函数上运行测试的方式是通过使用测试夹具中的函数来源文件.测试夹具如下所示:
MyScript.Tests.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"
Describe "Show-Input" {
It "Verifies input 'Hello' is equal to output 'Hello'" {
$output = Show-Input "Hello"
$output.should.be("Hello")
}
}
Run Code Online (Sandbox Code Playgroud) 我理解使用powershell可以更改注册表值.
例如,这里:http://poshcode.org/3504
我们可以像这样设置属性:
Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoice' -name ProgId IE.FTP
Run Code Online (Sandbox Code Playgroud)
但是,是否可以使用powershell设置这些二进制值?

我正在尝试编写一个 Powershell 脚本来识别 90 天未登录的用户,但我不断收到此错误消息:
找不到“op_Subtraction”的重载和参数计数:“2”。起初我认为这是变量类型不匹配,但查看减法变量看起来不错。
PS C:\> $today.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
PS C:\> $users[198].LastLogonDate.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
Run Code Online (Sandbox Code Playgroud)
$today = Get-Date
$days = 90
$users = Get-ADUser -Properties * -Filter *
foreach ($i in $users)
{
$difference = $today - $i.LastLogonDate
#Write-Host $i.Name + $difference.Days
if ($difference.Days -ge $days){Write-Host $i.name " hasn't logged on in 90 days"}
elseif ($i.LastLogonDate -eq $null) {Write-Host …Run Code Online (Sandbox Code Playgroud) 我想使用IIS中使用的算法生成加密的密码。
加密的值如下所示(在applicationHost.config中):
<applicationPools>
<add name="MyAppPool">
<processModel identityType="SpecificUser" userName="TestUser"
password="[enc:IISWASOnlyAesProvider:N8mr4dLU6PnMW5xlmCWg6914cKePgeU0fTbxew
ZppiwyTLmBQh0mZnFywQO78pQY:enc]" />
</add>
</applicationPools>
Run Code Online (Sandbox Code Playgroud)
参考:http : //technet.microsoft.com/en-us/library/dd163536.aspx
我看到机器密钥存储在这里:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
Run Code Online (Sandbox Code Playgroud)
参考:http : //www.asprangers.com/post/2012/05/03/MachineKeys-on-IIS-7x-Inside-Out.aspx
我想写一些c#来做到这一点,但我不是密码专家...我可以使用明文密码和机器密钥中的密钥在下面接受的SO答案中使用类似代码的方式来生成加密密码如上所示?
我在IIS中嵌套Web应用程序的"ConnectAs"域用户帐户编写脚本时遇到问题.我的目标环境是带有IIS 8的MS Server 2012 R2,但是,我在IIS 7上看到了与Windows 7相同的问题.
例如,假设我有"默认网站".在那之下,我有"MainApplication".在那之下,我有另一个"SubApplication"的Web应用程序.
我已尝试在其他类似于以下网站上找到的建议取得了部分成功:前两个语句有效.
Set-WebConfigurationProperty "system.applicationHost/sites/site[@name='Default Web Site']/application[@path='/MainApplication']/virtualDirectory[@path='/']" -name "username" -value "mydomain\user"
Set-WebConfigurationProperty "system.applicationHost/sites/site[@name='Default Web Site']/application[@path='/MainApplication']/virtualDirectory[@path='/']" -name "password" -value "mypassword"
Run Code Online (Sandbox Code Playgroud)
我似乎无法获得接下来两个语句的语法:
Set-WebConfigurationProperty "system.applicationHost/sites/site[@name='Default Web Site']/application[@path='/MainApplication/SubApplication']/virtualDirectory[@path='/']" -name "username" -value "mydomain\user"
Set-WebConfigurationProperty "system.applicationHost/sites/site[@name='Default Web Site']/application[@path='/MainApplication/SubApplication']/virtualDirectory[@path='/']" -name "password" -value "mypassword"
Run Code Online (Sandbox Code Playgroud)
在一个完美的世界中,我将能够执行类似于下面的操作,以快速使所有Web应用程序在相同的域用户帐户下运行:
Get-WebApplication | ForEach-Object { $_ | Set-ItemProperty -Name "username" -Value "domain\user" }
Get-WebApplication | ForEach-Object { $_ | Set-ItemProperty -Name "password" -Value "passwordValue" }
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
Get-WebApplication | ForEach-Object { $_.ChildElements | Select-Object -First 1 | Get-Member -Name …Run Code Online (Sandbox Code Playgroud) 我有一个清单:
data_list = ['a.1','b.2','c.3']
Run Code Online (Sandbox Code Playgroud)
我想只检索以另一个列表中的字符串开头的字符串:
test_list = ['a.','c.']
Run Code Online (Sandbox Code Playgroud)
a.1并c.3应退回.
我想我可以使用双循环:
for data in data_list:
for test in test_list:
if data.startswith(test):
# do something with item
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更优雅的东西,也许还有更多的信息.
如何使用PowerShell修改SharePoint列表中的项目值?当我尝试以下内容时:
$splist.GetItems() | ForEach-Object{
#Write-Host $_["Item"]
if($_["Item"] -eq $null){
$SPFileCollection = $folder.Files
$upFile=Get-ChildItem D:\Tools\SP-scripts\MDNSO-template.aspx
$tmpValue = $_["Title"]
$filename = "EM_Doc_Library\$tmpValue"
$SPFileCollection.Add("EM_Doc_Library\$tmpValue",$upFile.OpenRead(),$false)
Write-Host "creating the file"
Write-Host $_["Title"]
$_["Item"] = "MDNSO-<$tmpValue>"
}
}
Run Code Online (Sandbox Code Playgroud)
它说,unable to index into an object of type SPlistItem.
当我尝试在以管理员身份运行的 Windows 7 上使用 Get-Counter cmdlet 时,出现以下错误。
Get-Counter -computername "$env:ComputerName" '\Memory\Available MBytes'
Get-Counter : Unable to connect to the specified computer or the computer is of
fline.
At line:1 char:12
+ Get-Counter <<<< -computername "$env:ComputerName" '\Memory\Available MBytes
'
+ CategoryInfo : InvalidResult: (:) [Get-Counter], Exception
+ FullyQualifiedErrorId : CounterApiError,Microsoft.PowerShell.Commands.Ge
tCounterCommand
Run Code Online (Sandbox Code Playgroud)
当我在 XP 64 和 Windows 7 上按原样尝试它时,同样的命令可以工作,当我排除 -computername 参数时。
关于如何使用 computername 参数使其在 Windows 7 上工作的任何想法?
谢谢
需要 xcopy 命令的帮助,
我有一个目录结构,想复制其中的一些内容。我正在使用 xcopy 做同样的事情,但遇到了麻烦。我的目录结构如下。
I:\Foo\
|
|--coo-->c1-->c2
|--goo-->g1-->g2
|--boo-->b1-->b2
|--fow-->f1-->f2
Run Code Online (Sandbox Code Playgroud)
它又包含子文件夹和文件。我想将 coo 及其所有子文件夹复制到另一个位置,我的 xcopy 命令是,
xcopy I:\Foo\coo e:\temp /e/c/t/h/r/y /s
执行此命令会从 c1-->c2 复制文件夹和子文件夹,但文件夹 coo 丢失。
-问候,曼珠
powershell ×7
iis ×2
aes ×1
binary ×1
cryptography ×1
encryption ×1
iis-7 ×1
module ×1
permissions ×1
pester ×1
python ×1
sharepoint ×1
windows ×1
windows-xp ×1
xcopy ×1