标题: [其他] 【已解决】批处理如何实现有序名单每星期循环排列? [打印本页]
作者: for_flr 时间: 2022-3-22 16:35 标题: 【已解决】批处理如何实现有序名单每星期循环排列?
本帖最后由 for_flr 于 2022-3-23 15:25 编辑
单位有十个人,两人一组
老赵小赵,老钱小钱,老孙小孙,老李小李,老周小周。
根据社区临时通知进行疫情值守,从接到通知那天开始排值班表直到星期天。
上下午各留1人值班,按10人名单循环排列,但循环一次要求更改上下午次序。如(周二接到通知):- 时间 上午 下午
- 2022.3.22 周二 老赵 小赵
- 2022.3.23 周三 老钱 小钱
- 2022.3.24 周四 老孙 小孙
- 2022.3.25 周五 老李 小李
- 2022.3.26 周六 老周 小周
- 2022.3.26 周日 小赵 老赵
复制代码
假设下次社区通知是星期一,则- 时间 上午 下午
- 2022.3.27 周一 小钱 老钱
- 2022.3.28 周二 小孙 老孙
- 2022.3.29 周三 小李 老李
- 2022.3.30 周四 小周 老周
- 2022.3.31 周五 老赵 小赵
- 2022.4.1 周六 老钱 小钱
- 2022.4.2 周七 老孙 小孙
复制代码
每一周的排班表存到txt里
请问如何用代码根据接通知的时间和上次周七值班人员名,实现自动排班
作者: idwma 时间: 2022-3-22 18:06
一个思路- $a=gc asdf.txt
- while(1){
- $a[-5..-1]|%{
- $b=$_ -split '\s+'
- '{0}{1}' -f $b[-1],$b[-2]
- if(((get-date)+[timespan]::FromDays(++$i)).dayofweek -eq 'Sunday'){break}
- }
- }
复制代码
作者: WHY 时间: 2022-3-23 00:13
本帖最后由 WHY 于 2022-3-23 01:21 编辑
- $name = '姓名.txt'; #每行2个人名,以逗号(,)隔开
- $arr = gc $name;
- $count = $arr.Count;
- $today = (get-Date).DayOfWeek;
-
- $csv = @('日期,星期,上午,下午');
- $csv += for ($i = 0; $i -le (7-$today); $i++){
- $date = (get-Date).AddDays($i);
- $m = $i % $count;
- $date.ToString('yyyy/MM/dd') + ',' + $date.ToString('ddd') + ',' + $arr[$m];
- }
-
- sc '值班表.csv' -Value $csv;
-
- if ($count - $m - 1) {
- $arr = $arr[($m + 1)..($count - 1)] + $arr[0..$m]; #重新排序
- }
- $arr = $arr -replace '^([^,]+),([^,]+)$', '$2,$1'; #调换上、下午人员顺序
-
- sc $name -Value $arr;
复制代码
作者: for_flr 时间: 2022-3-23 15:23
本帖最后由 for_flr 于 2022-3-23 15:25 编辑
回复 3# WHY
感谢WHY神指导,借鉴修改,已能实现自动排表,谢谢。- $namelist="老赵,小赵,老钱,小钱,老孙,小孙,老李,小李,老周,小周" #原名字序列
- $namelist -split '(\w+,\w+)'|%{
- $a=$_.split(',',[stringsplitoptions]::removeemptyentries)
- [array]::reverse($a)
- $new+=$a
- }
- $exchange=$new -join "," #交换上下午名字序列
- $lastname="小李,老李" #上一次csv文件最后出现的名字顺序
- if ($namelist -match $lastname){$nameall=$namelist+","+$exchange}
- if ($exchange -match $lastname){$nameall=$exchange+","+$namelist}
- $namenew=($nameall -split "$lastname")[-1] #将两个序列按情况拼接在一起!
- $namenew=$namenew.split(',',[stringsplitoptions]::removeemptyentries)
-
- $csv = @('日期,上午,下午')
- $today=(get-date).dayofweek
- $csv+=for($i=0;$i -le (7-$today);$i++){
- $n=$i*2 #模运算有点烧脑。。添加$n来取名单
- $date=(get-date).adddays($i)
- "{0},{1},{2}" -f ($date.tostring('yyyy/MM/dd')+$date.tostring('ddd')),$namenew[$n],$namenew[$n+1]
- }
- $csvname=$date.tostring('yyyyMMdd')+".csv"
- sc $csvname -value $csv
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |