尝试将powershell脚本与函数一起使用,如下所示:
function MoveCompressFiles{
Param
(
[Parameter(Mandatory=$true )]
[string] $Des,
[Parameter(Mandatory=$true)]
[string] $Src
)
Add-Type -AssemblyName System.Drawing
$files = Get-ChildItem $Src
foreach ($f in $files) {
if (($f.Length / 1KB) -lt [int32]200) {
Copy-Item -Path $f.FullName -Destination $Des
}
else {
Copy-Item -Path $f.FullName -Destination $Des
while (((Get-Item (($Des).ToString() + "\$f")).Length / 1KB ) -gt 500) {
$img = [System.Drawing.Image]::FromFile((($Des).ToString() + "$f"))
[int32]$new_width = $img.Width * (20 / 100);
[int32]$new_height = $img.Height * (20 / 100);
$img2 = New-Object System.Drawing.Bitmap($new_width, $new_height)
$graph = [System.Drawing.Graphics]::FromImage($img2)
$graph.DrawImage($img, 0, 0, $new_width, $new_height)
$newImgName = "M".ToString() + $f.ToString()
$img2.Save(($Des).ToString()+"\$newImgName")
$img.Dispose()
$img2.Dispose()
Remove-Item ($Des.ToString()+$f)
Rename-Item -Path ($Des.ToString()+$newImgName) -NewName "$f"
Write-Host ((Get-Item ($Des.ToString()+$f)).Length / 1KB )
}
$filesize = $f.Length * 0.8
$filesize=($filesize / 1KB)
#$filesize = [math]::round(($filesize / 1KB), 0)
$abc = "KB"
$filesizeSTR = $filesize.ToString() + $abc
Push-Location $Src
mogrify -path $Des -define jpeg:extent=$filesizeSTR $f
Pop-Location
Write-Host "Moved file $f"
}
}
}
在Powershell中工作,但是当我尝试在我的解决方案中这样做时,
private static void Powershell()
{
string SCRIPT_PATH = System.IO.File.ReadAllText(@"C:\Untitled2.ps1");
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddScript(SCRIPT_PATH);
ps.Invoke();
ps.AddCommand("MoveCompressFiles").AddParameters(new Dictionary<string, string>
{
{"Des" , @"C:\Des"},
{"Src", @"C:\Src"}
});
}
}
它不起作用,我尝试了一些其他方法从ps脚本调用函数,但它仍然无法将文件移动到其他位置
1条答案
按热度按时间dbf7pr2w1#
由于您需要点源代码化脚本文件(
. <script>
)以使MoveCompressFiles
函数可用,这需要.AddScript()
调用,因此我建议在字符串变量中构建一段PowerShell代码,它既点源代码化脚本,又通过单个.AddScript()
调用调用函数。但是,为了保证
.AddScript()
工作,您必须首先确保PowerShell execution policy允许脚本调用,使用对Set-ExecutionPolicy
的调用;下面的代码使用-Scope Process
,以便限制对当前进程的更改。请注意,通过仅使用
PowerShell.Create()
,简化了 * 隐式 * 运行空间创建。嵌入式PowerShell代码点源化脚本文件(
. <script>
),以便定义MoveCompressFiles
函数,然后调用该函数。请注意,上面的代码(作为您自己的代码)并不捕获或打印PowerShell代码的输出(
.Invoke()
的输出)。要查看是否发生了错误,可以检查
ps.HadErrors
并检查ps.Streams.Error
或任何其他流,如.ps.Streams.Information
以获得Write-Host
输出(* success * 流的输出是.Invoke()
直接返回的内容)。例如,使用类似下面的代码来打印控制台的标准错误流中出现的所有错误(仅消息):
至于你所尝试的:
ps.AddScript(SCRIPT_PATH); ps.Invoke();
当这个函数 * 执行 * 脚本时,它是在一个 * 子作用域 * 中执行的,所以嵌入式函数
MoveCompressFiles
定义 * 没有 * 添加到会话的顶层作用域,所以后续的.AddCommand()
调用失败,因为MoveCompressFiles
函数不可用。相反,您必须对脚本(
. <script>
)使用点源代码,这将使其在调用者的作用域中运行,从而使其函数定义在那里可用。顺便说一句:尽管
.AddScript()
方法的名称,但它的主要用途是执行 * 一段PowerShell代码 *,而不是脚本 * 文件 *。要执行后者(不使用点源代码),请使用.AddCommand()
。