我的PS脚本我希望能够通过执行以下操作在另一个PS实例中运行另一个脚本:
$filepath = Resolve-Path "destruct.ps1"
start-process powershell.exe "$filepath"
Run Code Online (Sandbox Code Playgroud)
destruct.ps1与此脚本位于同一文件夹中
但是,当在包含空格的位置("C:\ My Scripts \")中运行此脚本时,我将收到以下错误:
术语"C:\ My"未被识别为cmdlet,函数,可操作程序或脚本文件.验证该术语,然后重试.
我知道通过使用带有Invoke-Expression方法的'&'来解决这个问题,我怎么能这样做但是通过使用start-process方法?
非常感谢您的帮助!
我在Start-Job中使用Start-Process时遇到问题,特别是在使用时-NoNewWindow.例如,这个测试代码:
Start-Job -scriptblock {
Start-Process cmd -NoNewWindow -Wait -ArgumentList '/c', 'echo' | out-null
Start-Process cmd # We'll never get here
}
get-job | wait-job | receive-job
get-job | remove-job
Run Code Online (Sandbox Code Playgroud)
返回以下错误,显然谷歌没有听说过:
Receive-Job:处理来自后台进程的数据时出错.报告错误:无法处理节点类型为"Text"的元素.仅支持Element和EndElement节点类型.
如果我删除-NoNewWindow一切工作就好了.我做的事情愚蠢,还是没有办法开始工作Start-Process -NoNewWindow?有什么好的选择?
我的程序作为一个提升的进程运行,并启动新的进程Process.Start().
出于安全原因,我希望将这些新进程作为非提升程序运行.
怎么做?
我有一个问题,我有一个脚本:
PSSession管理员帐户)我想在服务器上启动进程,所以我用PSSession连接(没问题)
我做Invoke-Command:
# $pathProg path to my program
Invoke-Command -session $mySession -command {Start-Process $($args[0])} -ArgumentList $pathProg
Run Code Online (Sandbox Code Playgroud)
但它什么都不做(我用VNC验证)
我也做Invoke-Command:
# $pathProg path to my program
Invoke-Command -session $mySession -command {&$($args[0])} -ArgumentList $pathProg
Run Code Online (Sandbox Code Playgroud)
这个程序很好(好)但我的脚本等待结束程序(不好)
有人有想法吗?
谢谢
我目前正在尝试使用Powershell连接到远程桌面,在该桌面上运行程序,然后注销.然后我检查在文件共享上运行该命令的输出.基本上这意味着PowerShell应该在继续之前等待该过程完成.
在阅读之后,我一直在尝试使用Start-Process -Wait选项来确保它等待进程运行.但是,此脚本必须作为计划任务运行,并且似乎无论何时在用户未登录时运行脚本,-wait都不起作用,并且脚本将继续运行而不完成该过程.我已经尝试了几种不同的等待选项,但显然我必须在用户注销以测试它时运行计划任务,并且测试变得筋疲力尽.这是我执行此操作的当前代码行:
$proc = $(start-process $path -Wait)
Run Code Online (Sandbox Code Playgroud)
请注意,我已尝试使用-NoNewWindow命令,但在我的PowerShell版本中不可用.
任何人都有任何其他想法让它等待这个过程?
我正在尝试为Windows 10编写一个powershell脚本,它将自动启动Metro风格的应用程序.Start-Process cmdlet似乎应该可以工作,但除非我提供.exe的路径,否则我无法启动它
例如,以下输入有效:
Start-Process 'C:\Program Files\Internet Explorer\iexplore.exe'
Run Code Online (Sandbox Code Playgroud)
不幸的是,Metro风格的应用程序没有可执行文件.我需要用什么文件来启动它们?例如,如果我想启动Windows应用商店,我该怎么做?
谢谢
$password = ConvertTo-SecureString \xe2\x80\x9cPassword+++\xe2\x80\x9d -AsPlainText -Force\n$Cred = New-Object System.Management.Automation.PSCredential ("Admin", $password)\n$FileLocale = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition\nWrite-Output $FileLocale\n$AntFile = "$FileLocale\\StartApps.ps1"\nWrite-Output $AntFile\nStart-Process PowerShell.exe -ArgumentList "-command &$AntFile -UserCredential $Cred" \nRun Code Online (Sandbox Code Playgroud)\n嗨,该代码在 .ps1 中运行,我调用另一个脚本,他完成了他的工作。但是当我在 ps2exe 的帮助下将其转换为 .exe 时,他不再做他的工作了。作为管理员与否。这不是我第一次使用该启动进程,但这是我第一次使用变量作为命令的目标。有谁知道 ps1 和 exe 之间出了什么问题吗?
\n谢谢
\n我有一个编辑注册表的PowerShell脚本,所以它需要以管理员身份运行.为此,我从运行的PowerShell脚本启动一个新的PowerShell进程,并使用带有函数的脚本块传递部分注册表键路径.当我在该函数中使用双引号时,PowerShell会尝试将它们解释为命令,而不是字符串.如果我使用单引号,那么一切正常.
我创建了一个简单的样本PowerShell脚本来重现问题.这是片段:
$ScriptBlock = {
function Test
{
$status = "This is a string"
Write-Output $status
}
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"
Run Code Online (Sandbox Code Playgroud)
因此,在新的PowerShell流程中,它将首先在脚本块中定义代码,然后调用Test方法,并产生以下错误:
这:术语"This"不被识别为cmdlet,函数,脚本文件或可操作程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.
所以它试图将字符串视为一个commad,就好像我刚刚This is a string在我的脚本中的新行上键入它一样.
如果我换行
$status = "This is a string"
Run Code Online (Sandbox Code Playgroud)
至
$status = 'This is a string'
Run Code Online (Sandbox Code Playgroud)
该脚本按预期工作,只是输出字符串This is a string.
我注意到的另一个奇怪的问题是,如果我不使用变量,只需使用:
Write-Output "This is a string"
Run Code Online (Sandbox Code Playgroud)
然后它在一个单独的行上输出每个单词,如下所示:
这个
是
一个
串
但如果我使用这样的单引号:
Write-Output 'This is a string'
Run Code Online (Sandbox Code Playgroud)
然后它按预期在一行输出整个句子.
有人知道为什么PowerShell在这些情况下会表现得很奇怪吗?
正如TessellatingHeckler所提到的,解决方案是用双引号,单引号包装任何双引号,或者你可以使用括号.
所以在我的例子中,你会改变: …
在 powershell 脚本中,我正在运行一个命令,该命令以管理员身份启动一个新的 powershell(如果我不是,如果需要,取决于$arg),然后运行该脚本。
我正在尝试将 stdout 和 stderr 重定向到第一个终端。
不是试图让事情变得更容易,也有争论。
param([string]$arg="help")
if($arg -eq "start" -Or $arg -eq "stop")
{
if().groups -match "S-1-5-32-544"))
{
Start-Process powershell -Verb runas -ArgumentList " -file servicemssql.ps1 $arg"
exit
}
}
$Services = "MSSQLSERVER", "SQLSERVERAGENT", "MSSQLServerOLAPService", "SSASTELEMETRY", "SQLBrowser", `
"SQLTELEMETRY", "MSSQLLaunchpad", "SQLWriter", "MSSQLFDLauncher"
function startsql {
"starting SQL services"
Foreach ($s in $Services) {
"starting $s"
Start-Service -Name "$s"
}
}
function stopsql {
"stopping SQL services"
Foreach ($s in $Services) {
"stopping $s" …Run Code Online (Sandbox Code Playgroud) 我需要从我的 UWP 应用程序调用批处理文件。这样做的方法似乎是Process.Start(),但它说当我按照它输出的路径时,它甚至没有找到文件,它肯定存在。文件路径和工作目录都作为使用 shellexecute = false 时所需的完整路径给出。
当我设置 useshellexecute = true 时它起作用。由于完整路径在这里有效,文件显然就在那里。使用 shellexecute = true 时,工作目录仅指定应搜索文件的位置,命令提示符在 system32 目录中启动,但我需要工作目录是打开的批处理所在的位置。
因此,ShellExecute = false。
我试过: 1. ShellExecute = true。它找到了文件,但工作目录设置不正确。2. 硬编码批处理的绝对路径。还是没找到。3. 设置 StartInfo.FileName 而不是通过参数给它。4. 相对路径 5. Process.Start(Filename)。Can't set Working Directory without StartInfo 6.看类似的问题,但答案总是我已经有了(当shellexecute = false时使用完整路径)
string executable = args[2];
string path = Assembly.GetExecutingAssembly().CodeBase;
string directory = Path.GetDirectoryName(path);
var startInfo = new ProcessStartInfo(directory + @"\Diagnose\_data\Updater\" + executable);
startInfo.UseShellExecute = false;
startInfo.WorkingDirectory = directory + @"\Diagnose\_data\Updater";
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
Process.Start(startInfo); …Run Code Online (Sandbox Code Playgroud) start-process ×10
powershell ×7
c# ×2
uwp ×2
.net ×1
appx ×1
exe ×1
function ×1
ps1 ×1
ps2exe-gui ×1
remoting ×1
scriptblock ×1
start-job ×1
string ×1
uac ×1
windows-10 ×1