[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 求助解惑PowerShell的for语句

我想把下面的C++ 语句转成Powershell, 但是不太理解下面一些语句:
第6到第8行的for语句
这for循环格式怎么是这样的, 是什么含意? 改成ps应该怎么改?

还有第12到第14行的语句
这几行的主要是实现什么功能? 第14行赋值是什么意思? 改成ps应该怎么改?

这些行中的函数在powershell应该不存在, 这里假设是存在的, 求路过大佬指导, 多谢
  1.                     // 得到上一行缩进设置
  2.                     int nIndent = SendEditor(SCI_GETLINEINDENTATION,line-1);
  3.                     // 查找上一行最后一个有效字符(非空白字符)
  4.                     int nPrevLinePos = SendEditor(SCI_POSITIONFROMLINE,line-1);
  5.                     int c = ' ';
  6.                     for(int p = pos-2;
  7.                         p>=nPrevLinePos && isspace(c);
  8.                         p--, c=SendEditor(SCI_GETCHARAT,p));
  9.                     // 如果是左括号,就多缩进四格
  10.                     if(c && strchr("{([<",c)) nIndent+=4;
  11.                     // 缩进...
  12.                     char space[1024];
  13.                     memset(space,' ',1024);
  14.                     space[nIndent] = 0;
  15.                     SendEditor(SCI_REPLACESEL, 0, (sptr_t)space);
复制代码

回复 20# Five66


    多谢大佬, 我找到了一个只有几十行代码就可以给9种编程语言着色的组件, 但是遇到点问题, 我新发一个贴子讨论

TOP

参考下面的(并不能直接运行,仅供参考),SendEditor弄成外部调用函数,还有因为有些不知道具体类型,不好弄而且可能出错
另外转成ps,还不如用C#之类封装一下...
  1. $SCI_GETCURRENTPOS=2008
  2. $SCI_LINEFROMPOSITION=2166
  3. $SCI_GETCHARAT=2007
  4. $SCI_WORDSTARTPOSITION=2266
  5. $SCI_POSITIONFROMLINE=2167
  6. $SCI_BRACEMATCH=2353
  7. $SCI_GETLINEINDENTATION=2127
  8. $SCI_SETTARGETSTART=2190
  9. $SCI_SETTARGETEND=2192
  10. $SCI_REPLACETARGET=2194
  11. $SCI_REPLACESEL=2170
  12. #int pos = SendEditor(SCI_GETCURRENTPOS); //取得当前位置
  13. $pos =[int]SendEditor($SCI_GETCURRENTPOS);
  14. #int line = SendEditor(SCI_LINEFROMPOSITION,pos); //取得当前行
  15. $line =[int]SendEditor($SCI_LINEFROMPOSITION,$pos);
  16. $strchr=$false;
  17. $aaaaaa=[byte[]][char[]]"})>]";
  18. $aaaaaa.foreach({if($_ -eq $LastProcessedChar){$strchr=$true}})
  19. #//如果最后输入的字符是右括号的话就自动让当前行缩进和它匹配的左括号所在行一致
  20. #if( strchr("})>]",LastProcessedChar) &&
  21.   if($strchr -and
  22. #    isspace(SendEditor(SCI_GETCHARAT,pos-2)) && //要求右括号左边是空白字符
  23.       (SendEditor($SCI_GETCHARAT,$pos-2) -eq 0x20) -and
  24. #    LastProcessedChar!=0)
  25.       ($LastProcessedChar -ne 0))
  26. {
  27. #    //找前一个单词起始位置,这里用它来确定右括号左边是否全是空白字符
  28. #    int startpos = SendEditor(SCI_WORDSTARTPOSITION,pos-1,false);
  29.       $startpos =[int]SendEditor($SCI_WORDSTARTPOSITION,$pos-1,$false);
  30. #    int linepos = SendEditor(SCI_POSITIONFROMLINE,line); //当前行起始位置
  31.       $linepos = SendEditor($SCI_POSITIONFROMLINE,$line);
  32. #    if(startpos == linepos) //这样相当于判断右括号左边是否全是空白字符
  33.       if($startpos -eq $linepos)
  34.      {
  35. #        int othpos = SendEditor(SCI_BRACEMATCH,pos-1); //得到对应的左括号所在的位置
  36.           $othpos =[int]SendEditor($SCI_BRACEMATCH,$pos-1);
  37. #        int othline = SendEditor(SCI_LINEFROMPOSITION,othpos);  //左括号所在行
  38.           $othline =[int]SendEditor($SCI_LINEFROMPOSITION,$othpos);
  39. #        int nIndent = SendEditor(SCI_GETLINEINDENTATION,othline);//左括号所在行的缩进值
  40.           $nIndent =[int]SendEditor($SCI_GETLINEINDENTATION,$othline);
  41. #        // 替换右括号前面的空白字符,使之与左括号缩进一致
  42. #        char space[1024];
  43.           $space=[char[]]::new(1024);
  44. #        memset(space,' ',1024);
  45.           (0..1023).foreach({$space[$_]=' '})
  46. #        SendEditor(SCI_SETTARGETSTART, startpos);
  47.           SendEditor($SCI_SETTARGETSTART, $startpos);
  48. #        SendEditor(SCI_SETTARGETEND, pos-1);
  49.           SendEditor($SCI_SETTARGETEND, $pos-1);
  50. #        SendEditor(SCI_REPLACETARGET,nIndent,(sptr_t)space);
  51.           #这里的space不知道该怎么传递
  52.      }
  53. }
  54. #// 如果输入的是回车,则保持与上一行缩进一致
  55. #// 如果上一行最后有效字符为左括号,就多缩进四个空格
  56. #if(LastProcessedChar == ' ')
  57.   if($LastProcessedChar -eq 0x20)
  58. {
  59. #    if(line > 0)
  60.       if($line -gt 0)
  61.     {
  62. #        // 得到上一行缩进设置
  63. #        int nIndent = SendEditor(SCI_GETLINEINDENTATION,line-1);
  64.           $nIndent =[int]SendEditor($SCI_GETLINEINDENTATION,$line-1);
  65. #        // 查找上一行最后一个有效字符(非空白字符)
  66. #        int nPrevLinePos = SendEditor(SCI_POSITIONFROMLINE,line-1);
  67.           $nPrevLinePos =[int]SendEditor($SCI_POSITIONFROMLINE,$line-1);
  68. #        int c = ' ';
  69.           $c=0x20;
  70. #        for(int p = pos-2;
  71.           $p=$pos-2
  72.           while($true){
  73. #p>=nPrevLinePos && isspace(c);
  74.   if(($p -ge $nPrevLinePos) -and ($c -eq 0x20)){break}
  75. #p--, c=SendEditor(SCI_GETCHARAT,p));
  76.   $p-=1;$c=SendEditor($SCI_GETCHARAT,$p);
  77. }
  78. $strchr=$false;
  79. $aaaaaa=[byte[]][char[]]"})>]";
  80. $aaaaaa.foreach({if($_ -eq $LastProcessedChar){$strchr=$true}})
  81. #        // 如果是左括号,就多缩进四格
  82. #        if(c && strchr("{([<",c)) nIndent+=4;
  83.           if ($c -and $strchr){$nIndent+=4}
  84. #        // 缩进...
  85. #        char space[1024];
  86.           $space=[char[]]::new(1024);
  87. #        memset(space,' ',1024);
  88.           (0..1023).foreach({$space[$_]=' '})
  89. #        space[nIndent] = 0;
  90.           $space[$nIndent] = 0;
  91. #        SendEditor(SCI_REPLACESEL, 0, (sptr_t)space);
  92.           #这里的space不知道该怎么传递
  93.     }
  94. }
复制代码

TOP

回复 18# 小白龙

是不想注册吗,找找免费的不要这么容易放弃呀,全部都试一下肯定有能用的
https://github.com/topics/chatgpt

TOP

回复 17# idwma

多谢大佬帮助, 这也太厉害了
能给个注册使用gpt的链接吗, 找了几个链接都不行

TOP

本帖最后由 idwma 于 2023-4-5 22:09 编辑

回复 16# 小白龙


    帮你问了一下
6到8行
这段代码是在使用Scintilla编辑器控件时用到的,主要功能是检查文本中某行上一部分的字符是否全部为空格字符。

具体来说:

使用for循环从当前位置向前遍历文本,p的初始化值为pos-2,表示从当前位置之前的一个位置开始,因为当前位置可能是空格字符,需要排除掉。

循环条件是p必须大于等于上一行开始的位置nPrevLinePos,并且c为一个空格字符,使用isspace函数判断c是否为空格字符。

在循环体中,每次将p向前移动一个字符位置,并使用SendEditor函数调用Scintilla编辑器控件的SCI_GETCHARAT命令,获取在p位置处的字符,并将其赋值给变量c。这样就能逐一检查该行的空格字符是否都已经被包含。

因此,这段代码的主要功能是检查文本中一行的前部分是否全部为空格字符,如果全部为空格字符,则满足特定的条件,可以执行相应的操作。

下面是将该代码转换成PowerShell代码:

for($p = $pos-2; $p -ge $nPrevLinePos -and [char]::IsWhiteSpace([char]$(SendEditor(SCI_GETCHARAT,$p))); $p--) {
    $c = [char]$(SendEditor(SCI_GETCHARAT,$p))
    # 在此处编写相应的操作
}
由于PowerShell对数据类型的转换较为严格,需要将SCI_GETCHARAT命令获取的字符数据类型转换成字符类型,才能进行空格字符的判断。


12到14行
这段代码是在使用Scintilla编辑器控件时用到的,主要功能是把一定数量的空格填充到编辑器中,并且从指定位置开始进行填充。

具体来说:

定义了一个长度为1024的char类型的数组变量space,用来存储空格字符。

使用memset函数将space中的元素都设置为空格字符,即' '。

将从数组下标为nIndent的位置开始后面的所有元素都设置为0,即空字符'\0'。这样做是为了保证在使用SCI_REPLACESEL命令替换选中文本时,替换的内容不会超出原有文本的长度。

使用SendEditor函数调用Scintilla编辑器控件的SCI_REPLACESEL命令,替换当前选中的文本。这里将要替换的内容设置为space,即一定数量的空格字符,从而实现在指定位置插入空格字符的目的。

因此,这段代码是用来在Scintilla编辑器控件中实现插入空格字符的功能的。其中,nIndent的值表示从哪个位置开始插入空格字符,可以根据实际需要进行调整。

TOP

回复 15# idwma

不会用chatgpt

TOP

问chatgpt试试
参考提问的智慧,切换不同的问法,多问几次
当他能理解你在问什么的时候,嘶

TOP

回复 13# jyswjjgdwtdtj

已经很感谢了,

发送消息的函数

TOP

回复 12# 小白龙


    ps是真的学不进去 那个指令语句实在难以接受真心帮不了你了
还有sendeditor是个啥函数?

TOP

本帖最后由 小白龙 于 2023-4-5 14:13 编辑

回复 11# jyswjjgdwtdtj

感谢指导, 还是搞不定,
上面的代码出自下面的链接
https://blog.csdn.net/yntcsb/article/details/83570675
  1.             int pos = SendEditor(SCI_GETCURRENTPOS); //取得当前位置
  2.             int line = SendEditor(SCI_LINEFROMPOSITION,pos); //取得当前行
  3.             //如果最后输入的字符是右括号的话就自动让当前行缩进和它匹配的左括号所在行一致
  4.             if( strchr("})>]",LastProcessedChar) &&
  5.                 isspace(SendEditor(SCI_GETCHARAT,pos-2)) && //要求右括号左边是空白字符
  6.                 LastProcessedChar!=0)
  7.             {
  8.                 //找前一个单词起始位置,这里用它来确定右括号左边是否全是空白字符
  9.                 int startpos = SendEditor(SCI_WORDSTARTPOSITION,pos-1,false);
  10.                 int linepos = SendEditor(SCI_POSITIONFROMLINE,line); //当前行起始位置
  11.                 if(startpos == linepos) //这样相当于判断右括号左边是否全是空白字符
  12.                 {
  13.                     int othpos = SendEditor(SCI_BRACEMATCH,pos-1); //得到对应的左括号所在的位置
  14.                     int othline = SendEditor(SCI_LINEFROMPOSITION,othpos);  //左括号所在行
  15.                     int nIndent = SendEditor(SCI_GETLINEINDENTATION,othline);//左括号所在行的缩进值
  16.                     // 替换右括号前面的空白字符,使之与左括号缩进一致
  17.                     char space[1024];
  18.                     memset(space,' ',1024);
  19.                     SendEditor(SCI_SETTARGETSTART, startpos);
  20.                     SendEditor(SCI_SETTARGETEND, pos-1);
  21.                     SendEditor(SCI_REPLACETARGET,nIndent,(sptr_t)space);
  22.                 }
  23.             }
  24.             // 如果输入的是回车,则保持与上一行缩进一致
  25.             // 如果上一行最后有效字符为左括号,就多缩进四个空格
  26.             if(LastProcessedChar == ' ')
  27.             {
  28.                 if(line > 0)
  29.                 {
  30.                     // 得到上一行缩进设置
  31.                     int nIndent = SendEditor(SCI_GETLINEINDENTATION,line-1);
  32.                     // 查找上一行最后一个有效字符(非空白字符)
  33.                     int nPrevLinePos = SendEditor(SCI_POSITIONFROMLINE,line-1);
  34.                     int c = ' ';
  35.                     for(int p = pos-2;
  36.                         p>=nPrevLinePos && isspace(c);
  37.                         p--, c=SendEditor(SCI_GETCHARAT,p));
  38.                     // 如果是左括号,就多缩进四格
  39.                     if(c && strchr("{([<",c)) nIndent+=4;
  40.                     // 缩进...
  41.                     char space[1024];
  42.                     memset(space,' ',1024);
  43.                     space[nIndent] = 0;
  44.                     SendEditor(SCI_REPLACESEL, 0, (sptr_t)space);
  45.                 }
  46.             }
复制代码

TOP

这些语言都是一家门 起码for长得一毛一样!
网上随便搜了个例子
  1. for($x=1; $x -lt 10; $x=$x+1)   
  2. {   
  3. echo $x   
  4. }
复制代码

TOP

回复 9# 小白龙


    ps怎么可能没有循环!?

TOP

回复 8# jyswjjgdwtdtj


    多谢指导, 貌似懂了, 但是改成ps代码还是行不通

TOP

回复 7# 小白龙
  1. for([init];[condition];[[increment],[[statement1],statment2]……]);
复制代码
=
  1. for([init];[condition];increment){
  2. statement1;
  3. statement2;
  4. ……
  5. }
复制代码
明白了吗?

TOP

返回列表