默认情况下,Powershell最初被禁用,可能是出于安全原因.
当我要求启用它以便我可以使用它时,管理员小心谨慎采取可能使服务器更容易受到攻击的行为,因此,它没有启用,我等待了.
虽然微软在安全性方面有一个糟糕的记录,并且一个功能被禁用可能在理论上更加安全,启用它,但这与任何事情都有关系.
Powershell本质上更危险,它应该比任何其他Windows脚本语言更令人担心吗?
我有以下情况:带有以下变量的 powershell 脚本:
$RUBY = "C:\installing\ruby\bin\ruby.exe"
$ARGS = "C:\files\sript.rb $Arg1 $Arg2 $Arg3"
Run Code Online (Sandbox Code Playgroud)
在批处理文件中我可以写
%RUBY% %ARGS%
Run Code Online (Sandbox Code Playgroud)
它有效。
但我怎样才能在 powershell 中做到这一点?
重要的是 ruby 安装路径是可变的。
我尝试使用 Start-Process 但只启动了 ruby.exe,没有脚本。
有什么提示吗?
谢谢。
我正在编写通用的PowerShell脚本来在远程计算机上执行部署.我遇到了一个我无法超越的问题,这个问题是ArgumentList传递的Scriptblock中带双引号的参数
我有这样的事情:
$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`")
foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage
}
Run Code Online (Sandbox Code Playgroud)
我在$ deploymentPackages中添加了双引号.而且我仍然像我一样快速执行我的命令(当然失败了):
D:\some path\Command.exe -package:package - one - external -action:doit
D:\some path\Command.exe -package:package - two - external -action:doit
D:\some path\Command.exe -package:package - three - external -action:doit
Run Code Online (Sandbox Code Playgroud)
适当的执行路径应该是:
D:\some path\Command.exe -package:"package - three - …Run Code Online (Sandbox Code Playgroud) 有没有办法抑制PowerShell喜欢生成的每个命令行参数周围的括号引号,然后传递给包含空格的命令行参数的外部可执行文件?
情况如下:
解压许多安装程序的一种方法是使用以下形式的命令:
msiexec /a <packagename> /qn TARGETDIR="<path to folder with spaces>"
Run Code Online (Sandbox Code Playgroud)
尝试从PowerShell执行此操作已经证明非常困难.PowerShell喜欢用双引号括起空格参数.以下行:
msiexec /a somepackage.msi /qn 'TARGETDIR="c:\some path"'
msiexec /a somepackage.msi /qn $('TARGETDIR="c:\some path"')
$td = '"c:\some path"'
msiexec /a somepackage.msi /qn TARGETDIR=$td
Run Code Online (Sandbox Code Playgroud)
所有结果都生成以下命令行(由Win32 GetCommandLine()API报告):
"msiexec" /a somepackage.msi /qn "TARGETDIR="c:\some path""
Run Code Online (Sandbox Code Playgroud)
这个命令行:
msiexec /a somepackage.msi TARGETDIR="c:\some path" /qn
Run Code Online (Sandbox Code Playgroud)
结果是
"msiexec" /a fooinstaller.msi "TARGETDIR=c:\some path" /qn
Run Code Online (Sandbox Code Playgroud)
似乎PowerShell在将表达式传递给外部可执行文件时,希望将表达式的结果用于表示引号中的一个参数.这适用于大多数可执行文件.但是,MsiExec非常关注它想要的引用规则,并且不接受PowerShell为路径生成的任何命令行.
有没有办法抑制这种行为?
我正在从powershell调用一个zip实用程序,并且很难直接获取其参数.这是代码:
if (-not (test-path "C:\Program Files (x86)\7-Zip\7z.exe")) {throw "C:\Program Files (x86)\7-Zip\7z.exe needed"}
set-alias sz "C:\Program Files (x86)\7-Zip\7z.exe"
$argument_1 = "c:\temp\DeployTemp\"
$argument_0 = "c:\temp\Release\Web_Feature_2012R10_1_1112.prod.com.zip"
sz x $argument_0 -o$argument_1
Run Code Online (Sandbox Code Playgroud)
问题是7zip可执行调用实际上是提取到名为$ argument_1的目录,而不是存储在字符串中的实际值.我试过在几个方面逃避价值,但没有运气.不幸的是7zip"-o"标志在它和输出目录之间没有空格......
由于混乱的组策略对象,多个计算机不应安装TightVNC.GPO已经不见了,所以从那里删除软件并不是我所知道的选项.因此,我正在编写脚本以便从计算机列表中删除PowerShell.
这是我的脚本:
if ($args.length -ne 1) {
Write-Warning "Must pass computer name, ending script.";
break
}
$pc = $args[0]
Write-Output "Scanning $pc for TightVNC...."
$prod = wmic /node:$pc product get name | where {$_ -match "TightVNC"}
if ($prod) {
Write-Output "Found TightVNC, attempting uninstall...."
wmic /node:$pc product where name="TightVNC" call uninstall
} else {
Write-Warning "Could not find TightVNC on $pc."
}
Write-Output "Done."
Run Code Online (Sandbox Code Playgroud)
现在,我的输出如下:
Scanning [computer] for TightVNC....
Found TightVNC, attempting uninstall....
ERROR:
Description = Invalid query
Done.
Run Code Online (Sandbox Code Playgroud)
但是,如果我将第二个wmic行复制并粘贴到一个提升的命令提示符并用[computer]替换$ …
我对 Powershell 还很陌生,但我在 VBScript 和 Python 方面有很多经验。我正在努力成为一名优秀的 Windows 管理员并更多地使用 Powershell。所以,这就是我想要做的:父文件夹包含数十个名为 AD 用户名的子文件夹(例如,Users\username1、Users\username2,其中 Users 是父文件夹)。我想遍历每个文件夹名称,解析出子文件夹名称,并将其传递给 icacls 以根据用户名应用权限。我做了一个多班轮,因为我遇到了管道问题。这是我尝试了几种不同方法后的结果:
$root_folder = "c:\temp\test"
$cmd1 = "icacls "
$cmd2 = " /grant cm\"
$cmd3 = ":`(OI`)`(CI`)F"
$paths_collection = get-childitem $root_folder | foreach-object -process {$_.FullName}
foreach ($path in $paths_collection)
{$string = $path.split("\");$last = $string[-1];$command = $cmd1 + $path +$cmd2 +$last +$cmd3;invoke-expression $command}
Run Code Online (Sandbox Code Playgroud)
它最初并不那么粗糙,但是当我遇到问题时,我开始将其分解。
问题- 在 $cmd3 中,(OI)(CI) 没有完全进入调用表达式。如果我将 $cmd3 更改为 ":F" 它可以工作,但我必须使用有问题的参数设置继承。请帮忙。我一整天都在绞尽脑汁想这个。无法真正找到专门处理此问题的任何内容(尝试反引号,将 $command 引用为“$command”等)
错误: 术语“OI”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。在第 1 行字符:56 + icacls C:\temp\test\garthwaitm /grant domain\user1 :(OI …
我正在尝试在Windows PowerShell上运行它:
svn ci -m "" directory_name
Run Code Online (Sandbox Code Playgroud)
但它返回:
svn:E205005:日志消息是路径名(-F意图?); 使用'--force-log'覆盖
我试图cd该目录并提交没有directory_name参数,并返回:
svn ci -m ""
Run Code Online (Sandbox Code Playgroud)
svn.exe:缺少参数:m
我认为powershell可能不理解-args但很少(对我而言)这有效:
svn -h
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?这一切在cmd完美运行:/
当我在下面运行Powershell脚本时,我收到以下错误.如何通过参数PowerShell运行程序?该脚本将是一个组策略登录.
Invoke-Expression:找不到接受参数'\ TBHSERVER\NETLOGON\BGInfo\BGIFILE.bgi/timer:0/s ilent/nolicprompt'的位置参数.在X:\ Systems\scripts\PowerShell\UpdateDesktopWithBGInfo.ps1:6 char:18 + Invoke-Expression <<<< $ logonpath $ ArguList + CategoryInfo:InvalidArgument :( :) [Invoke-Expression],ParameterBindingException + FullyQualifiedErrorId:PositionalParameterNotFound, Microsoft.PowerShell.Commands.InvokeExpressionCommand
$LogonPath = $env:LOGONSERVER + "\NETLOGON\BGInfo\Bginfo.exe"
$ArguList = $env:LOGONSERVER + '\NETLOGON\BGInfo\BGIFILE.bgi /timer:0 /silent /nolicprompt '
invoke-command $LogonPath
Invoke-Expression $logonpath $ArguList
Run Code Online (Sandbox Code Playgroud)